Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在AsyncTask中未调用onPostExecute<;Void,Void,Boolean>;抽象类_Android_Android Asynctask_Abstract Class - Fatal编程技术网

Android 在AsyncTask中未调用onPostExecute<;Void,Void,Boolean>;抽象类

Android 在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

我正在使用谷歌日历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.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)");
    }
}