我有一個自定義的AsyncTask類,用於檢查設備是否授予位置權限,然後獲取最後一個已知位置。如果沒有權限,則首先請求用戶許可。所以在我的doInBackground函數中,我需要調用mGoogleApiClient.connect(),這將觸發onConnected函數。可以看出,doInBackground需要等待onConnected,否則返回null對象lastKnownLocation。我的問題是我如何讓doInBackground等待onConnected?如何使doInBackground()等待AyncTask類中的另一個函數?
public class GetLocationTask extends AsyncTask<Void, Void, Location> implements GoogleApiClient.ConnectionCallbacks
, GoogleApiClient.OnConnectionFailedListener {
private Context context;
private Activity activity;
private GoogleApiClient mGoogleApiClient;
private Location lastKnownLocation = null; //In case the users reject location permission request, we might initialize the location to something interesting
public AsyncResponseForLocation delegate = null;
private static final int MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1;
public GetLocationTask(Activity activity, Context context) {
this.activity = activity;
this.context = context;
}
@Override
protected Location doInBackground(Void... params) {
if (mGoogleApiClient == null) {
mGoogleApiClient = new GoogleApiClient.Builder(context)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
mGoogleApiClient.connect();
return lastKnownLocation;
}
@Override
public void onConnected(@Nullable Bundle bundle) {
if (ActivityCompat.checkSelfPermission(context,
android.Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(context,
android.Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity,
new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
}
lastKnownLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
@Override
protected void onPostExecute(Location location) {
delegate.processFinish(location);
}
public interface AsyncResponseForLocation {
void processFinish(Location location);}
我不能使用while(lastKnownLocation == null){}來等待對象,因爲在某些情況下此對象可能爲null。 – Tao
檢查[CompletableFuture](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html)並使用'get'來「如果需要等待這個未來完成,然後返回結果。「 – VladoDemcak
我終於找到了解決辦法。但也要感謝Lior指出工作流程問題。 我創建了一個變量private boolean onConnectedCompleted = false; 和onConnected(),我添加onConnectedCompleted = true;在最後一次。然後在我的doInBackground中,我只需要檢查這個條件。 – Tao