首页 > 解决方案 > AsyncTask 方法 doInBackground() 如何知道何时完成?

问题描述

我有一个HttpPostAsyncTask扩展类,AsyncTask用于将数据发送到我的快速服务器并从中获取响应。现在,虽然返回了响应并且我将响应作为字符串返回,但该doInBackground()方法并未完成,因此AsyncTask仍在运行。

我的doInBackground()方法如下所示:

URL url = new URL(params[0]);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.connect();

int statusCode = urlConnection.getResponseCode();
switch (statusCode) {
  case 400:
    return "Error 400 - Bad request.";
  case 401:
    return "Error 401 - Unauthorized request.";
}

现在,当我登录时statusCode,我得到了正确的结果。但该doInBackground()方法并未结束,因此该任务仍在运行。

我在互联网上搜索了很多地方,但无法找到究竟是什么触发了该doInBackground方法的结束?如果结束,我想 AsyncTask 也应该结束,我可以在onPostExecute()方法中接收结果。

编辑1: 所以我有一个调用startActivityForResult两次的活动A。首先,我有一个GoogleSignInIntent,我正在呼吁startActivityForResult。如果它正确返回结果,我会startActivityForResult再次调用(requestCode显然不同)。现在,我按照这篇文章statusCode,为方法中的所有s实现了一个CustomCallback doInBackground()。我还在doInBackground().

所以 GoogleSignInIntent 正确返回结果,我开始下一个意图,我的服务器为此返回正确的响应代码,我调用自定义回调处理程序并从我的doInBackground(). 仍然onPostExecute()没有调用。

标签: android

解决方案


请务必注意,您需要将内部类声明为静态,因为它们不包含对活动的引用以避免内存泄漏。当您的活动完成时,您还需要取消异步任务(例如 onDestroy() 方法)。要了解有关此主题的更多信息,请查看这篇中篇文章关于 Android 应用程序中的内存泄漏你需要知道的一切

private AsyncTask mHttpPostAsyncTask;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mHttpPostAsyncTask = new HttpPostAsyncTask().execute();

}

@Override
public void onDestroy() {
    super.onDestroy();
    if (mHttpPostAsyncTask != null) {
        mHttpPostAsyncTask.cancel(true);
    }
}

// --------------------------------------------------------------------------
//                                Inner Classes
// --------------------------------------------------------------------------
private static class HttpPostAsyncTask extends AsyncTask<Void, Void, String> {
    @Override
    protected String doInBackground(Void... voids) {
        URL url = new URL(params[0]);
        urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setRequestMethod("GET");
        urlConnection.connect();

        int statusCode = urlConnection.getResponseCode();
        switch (statusCode) {
            case 400:
                return "Error 400 - Bad request.";
            case 401:
                return "Error 401 - Unauthorized request.";
        }
        return null;
    }

    @Override
    protected void onPostExecute(String s) {
        // doInBackground() has finished. Do something with your string.
        // Remember to check that it isn't null to avoid NPE.
        if (s != null) {
            // do something with the result.
        }
    }
}

推荐阅读