Android 在AsyncTask中未调用onPostExecute<;Void,Void,Boolean>;抽象类
我正在使用谷歌日历API,并坚持使用AsyncTask。如果使用抽象类,则无法调用onPostExecute MakeRequestTask.javaAndroid 在AsyncTask中未调用onPostExecute<;Void,Void,Boolean>;抽象类,android,android-asynctask,abstract-class,Android,Android Asynctask,Abstract Class,我正在使用谷歌日历API,并坚持使用AsyncTask。如果使用抽象类,则无法调用onPostExecute MakeRequestTask.java import android.app.ProgressDialog; import android.os.AsyncTask; import android.util.Log; import com.google.api.client.googleapis.extensions.android.gms.auth.GooglePlayServic
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.util.Log;
import com.google.api.client.googleapis.extensions.android.gms.auth.GooglePlayServicesAvailabilityIOException;
import com.google.api.client.googleapis.extensions.android.gms.auth.UserRecoverableAuthIOException;
import java.io.IOException;
import java.util.List;
abstract class MakeRequestTask extends AsyncTask<Void, Void, Boolean> {
private String TAG = "MakeRequestTask";
final MainActivity mainactivity;
final com.google.api.services.calendar.Calendar mService;
private Exception mLastError = null;
ProgressDialog loading = null;
//Calendar service;
MakeRequestTask(MainActivity mainactivity) {
this.mainactivity = mainactivity;
this.mService = mainactivity.mService;
loading = new ProgressDialog(mainactivity);
loading.setCancelable(true);
loading.setMessage("Sync with Google Calendar";
loading.setProgressStyle(ProgressDialog.STYLE_SPINNER);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.i(TAG, "onPreExecute");
mainactivity.numAsyncTasks++;
loading.show();
}
@Override
protected final Boolean doInBackground(Void... ignored) {
Log.i(TAG, "doInBackground");
try {
doInBackground();
return true;
} catch (final GooglePlayServicesAvailabilityIOException availabilityException) {
mainactivity.showGooglePlayServicesAvailabilityErrorDialog(
availabilityException.getConnectionStatusCode());
} catch (UserRecoverableAuthIOException userRecoverableException) {
mainactivity.startActivityForResult(
userRecoverableException.getIntent(), MainActivity.REQUEST_AUTHORIZATION);
} catch (IOException e) {
//Utils.logAndShow(activity, MainActivity.TAG, e);
Log.i(TAG, "IOException" + e);
}
return false;
}
@Override
protected final void onPostExecute(Boolean success) {
super.onPostExecute(success);
Log.i(TAG, "onPostExecute");
loading.cancel();
if (0 == --mainactivity.numAsyncTasks) {
}
if (success) {
}
}
abstract protected void doInBackground() throws IOException;
}
从这个问题可以看出,如果我不使用抽象类并将AsyncTaskJava更改为如下所示,那么将调用onPostExecute
...
@Override
protected final Boolean doInBackground(Void... ignored) {
Log.i(TAG, "doInBackground");
return true;
}
...
如果有人能指出我代码中的任何错误,我真的很感激,即使是重复的解决方案也很好,只要提供清晰的解释或指导
如果您想在我的抽象类中添加更多代码,我会这样做。好的,我在经过一些改进后发现了这个问题。它与我的抽象类有关 AsyncLoadEvent.java(抽象类之一) 该类跳入异常并运行“cancel(true)”,因为我试图更新“getDataFromApi()”中的UI组件,然后它不会调用onPostExecute() 我在AsyncTask类中查找Override方法,发现onCancelled()可用。看到一个说: 调用此方法将导致调用onCancelled(对象) 在doInBackground(对象[])返回后的UI线程上。叫这个 方法保证永远不会调用onPostExecute(对象)。之后 调用此方法时,应检查 定期从doInBackground(对象[])执行isCancelled()以完成 尽早完成任务
...
@Override
protected final Boolean doInBackground(Void... ignored) {
Log.i(TAG, "doInBackground");
return true;
}
...
@Override
protected void doInBackground() throws IOException {
Log.i(TAG, "doInBackground");
try {
getDataFromApi();
} catch (Exception e) {
Log.i(TAG, "Exception : " + e);
cancel(true);
Log.i(TAG, "cancel(true)");
}
}