繁体   English   中英

AsyncTask未完成时无法关闭活动

[英]Cannot close Activity while AsyncTask is not finished

我的Activity运行着一个AsyncTask 在该AsyncTaskdoInBackground(Object[])方法中,我执行网络操作,该操作使用HTTP POST方法将一些数据发送到服务器,接收响应,然后在其onPostExecute(Object)方法中将该响应发送到Service ,然后所有工作均由Service执行。 问题是:在AsyncTask完成之前,我无法关闭Activity Activity只会冻结,直到AsyncTask完成。 有时,如果AsyncTask需要更多时间才能完成,则屏幕会变黑并一直保持黑屏状态,直到AsyncTask完成。 这是为什么? 如何避免这种情况? 我试过在ActivityonStop()方法中调用AsyncTaskcancel(boolean) ,但它仍然执行相同的行为。

编辑:我的AsyncTask代码:

private static class PostCommentTask extends AsyncTask<String, Void, String> {
    Activity activity;
    int status;
    Toast indicationMsg;

    public PostCommentTask(Context context) {
        activity = (Activity) context;
    }

    private boolean isNetworkAvailable() {
        Log.i("ilog", "isNetworkAvailable() called");
        ConnectivityManager connManager = (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connManager.getActiveNetworkInfo();

        return activeNetworkInfo != null && activeNetworkInfo.isConnected() && activeNetworkInfo.isAvailable();
    }

    protected String doInBackground(String... param) {
        if (!isNetworkAvailable()) {
            return "";
        }

        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(param[7]);
        String responseBody = "error in PostComment.doInBackground()";

        try {
            List<NameValuePair> params = new ArrayList<NameValuePair>(7);
            params.add(new BasicNameValuePair("somevar", param[0]));
            params.add(new BasicNameValuePair("somevar", param[1]));
            params.add(new BasicNameValuePair("somevar", param[2]));
            params.add(new BasicNameValuePair("somevar", param[3]));
            params.add(new BasicNameValuePair("somevar", param[4]));
            params.add(new BasicNameValuePair("somevar", param[5]));
            params.add(new BasicNameValuePair("somevar", param[6]));

            httpPost.setEntity(new UrlEncodedFormEntity(params));

            HttpResponse response = httpClient.execute(httpPost);

            status = response.getStatusLine().getStatusCode();
            Log.i("ilog", "response status: " + status);

            HttpEntity responseEntity = response.getEntity();
            if (responseEntity != null) {
                responseBody = EntityUtils.toString(responseEntity);
            }

        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        Log.i("ilog", "Response: " + responseBody);

        return responseBody;
    }

    public void onPostExecute(String responseBody) {
        String success = "{\"status\":\"OK\"}";
        if (responseBody.equals(success) && status == 200){
            indicationMsg = Toast.makeText(activity, "Success!!!", Toast.LENGTH_LONG);

            CommentsFragment.CommentsHandler commentsHandler = new CommentsFragment.CommentsHandler();

            Messenger messenger = new Messenger(commentsHandler);

            Intent serviceIntent = new Intent(activity, WindowService.class);
            serviceIntent.putExtra("messenger", messenger);
            serviceIntent.putExtra("somevar", somevar);
            serviceIntent.putExtra("somevar", activity.getIntent().getStringExtra("somevar"));
            activity.startService(serviceIntent);
            //
        }
        else
            indicationMsg = Toast.makeText(activity, "Failed...", Toast.LENGTH_LONG);
        indicationMsg.show();
    }
}

CommentsHandler类是处理Service响应的类。 这就是我在ActivityService之间进行通信的方式。

我使用以下代码启动AsyncTask

public static class CommentsFragment extends Fragment {
    /** ... **/
    @Override
    public void onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        /** ... **/
        Button queryButton = (Button) rootView.findViewById(R.id.query_button);
        queryButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /** ... **/
                new PostCommentTask(activity).execute(somevar, somevar, somevar, somevar, somevar, somevar, somevar, somevar);
                /** ... **/
            }
        });
        /** ...  **/
    }
    /** ... **/
}

我已经解决了这个问题。 Activity被冻结,因为我要从该Activity返回的Activity也在其onResume()方法中使用了AsyncTask ,因此它必须等到关闭的Activity的第一个任务完成后再执行自己的任务,这导致了UI冻结。 现在,我正在使用executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, Object[]能够并行运行多个任务,而不是executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, Object[]运行(一个接一个)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM