【发布时间】:2018-01-26 18:40:24
【问题描述】:
我是 android 的初学者。在这里我试图在 Marshmallow (NearLocations.execute()) 中授予运行时权限后调用特定的异步任务,但如果我授予权限(允许) 我的异步任务多次调用,进度条一直在加载。建议我如何解决这个问题?
public class DashViewScreen extends Fragment implements OnRefreshListener {
public static final int MULTIPLE_PERMISSIONS = 10; // code you want.
String[] permissions = new String[] {
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION };
Location mLocation;
View v1;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
v = inflater.inflate(R.layout.dashboard_layout, container, false);
initialUISetup();
Toast.makeText(getActivity(), "Oncreate", Toast.LENGTH_SHORT).show();
checkPermission(getActivity());
return v;
}
@SuppressWarnings("deprecation")
public void initialUISetup() {
//Async task one
mTask = new Information(v, false);
mTask.execute();
}
private class Information extends AsyncTask<Void, Void, Object> {
private ProgressDialog mProgressDialog;
private View v1;
@Override
protected void onPreExecute() {
super.onPreExecute();
Toast.makeText(getActivity(), "Retrieve Acc", Toast.LENGTH_SHORT).show();
mTask = null;
}
@Override
protected Object doInBackground(Void... params) {
AccountInformation results = null;
results = AppUtil.drex.AccountInformation(v1.getContext());
return results;
}
@Override
protected void onPostExecute(Object result) {
super.onPostExecute(result);
mAccInfo = (AccountInformation) result;
//Async task two
mTask = new Messages().execute();
}
}
private boolean checkPermission(Activity act) {
int result;
List<String> listPermissionsNeeded = new ArrayList<>();
for (String p : permissions) {
result = ContextCompat.checkSelfPermission(act, p);
if (result != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(p);
} else {
if (lastLocation == null) {
locationManager = (LocationManager) v.getContext()
.getSystemService(Context.LOCATION_SERVICE);
gpsLocationListener = createListener(v);
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, 0, 0,
gpsLocationListener);
}
//Async three
new NearLocations(lastLocation, v).execute();
}
}
if (!listPermissionsNeeded.isEmpty()) {
requestPermissions(
listPermissionsNeeded.toArray(new String[listPermissionsNeeded
.size()]), MULTIPLE_PERMISSIONS);
return false;
}
return true;
}
@Override
public void onRequestPermissionsResult(int requestCode,
String[] permissions, int[] grantResults) {
// TODO Auto-generated method stub
switch (requestCode) {
case MULTIPLE_PERMISSIONS: {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
lastLocation = AppUtil.getMyLastLocation(v.getContext());
if (lastLocation == null) {
locationManager = (LocationManager) v.getContext()
.getSystemService(Context.LOCATION_SERVICE);
lastLocation = AppUtil.getBestLocation(v.getContext(),
locationManager);
gpsLocationListener = createListener(v);
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, 0, 0,
gpsLocationListener);
}
new NearLocations(lastLocation, v).execute();
} else {
AppUtil.saveBoolToPrefs(getActivity(), "stopPopup", true);
}
return;
}
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
【问题讨论】:
-
每次您在 AndroidManifest 中提到的询问和检查权限时,您都在运行您的异步任务,请只执行一次任务或只创建一个 NearLocation 类的实例并执行它。
-
为什么要调用 mTask = new Messages().execute(); onOnPostExecute() 你检查过 onPostExecute() 方法被调用了多少次
标签: android android-asynctask runtime-permissions