gpt4 book ai didi

java - 如何让 doInBackground() 等待 AsyncTask 类中的另一个函数?

转载 作者:行者123 更新时间:2023-11-30 00:57:16 25 4
gpt4 key购买 nike

我有一个自定义的 AsyncTask 类,它检查设备是否已授予位置权限,然后它获取最后一个已知位置。如果没有权限,它会先向用户请求权限。所以在我的 doInBackground 函数中,我需要调用 mGoogleApiClient.connect() ,这将触发 onConnected 函数。可以看出,doInBackground需要等待onConnected,否则返回空对象lastKnownLocation。我的问题是如何让 doInBackground 等待 onConnected?

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);}

最佳答案

实现一个 Timertask,每 5 秒运行一次以检查条件 isConnected()。

试试下面的代码

   private void startTimer(){
mTimer1 = new Timer();
mTt1 = new TimerTask() {
public void run() {
mTimerHandler.post(new Runnable() {
public void run(){
if(isConnected){

//call the Async task
}
}
});
}
};

mTimer1.schedule(mTt1, 1, 5000);
}

关于java - 如何让 doInBackground() 等待 AsyncTask 类中的另一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39940892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com