[英]Cannot close Activity while AsyncTask is not finished
我的Activity
运行着一个AsyncTask
。 在该AsyncTask
的doInBackground(Object[])
方法中,我执行网络操作,该操作使用HTTP POST
方法将一些数据发送到服务器,接收响应,然后在其onPostExecute(Object)
方法中将该响应发送到Service
,然后所有工作均由Service
执行。 问题是:在AsyncTask
完成之前,我无法关闭Activity
。 该Activity
只会冻结,直到AsyncTask
完成。 有时,如果AsyncTask
需要更多时间才能完成,则屏幕会变黑并一直保持黑屏状态,直到AsyncTask
完成。 这是为什么? 如何避免这种情况? 我试过在Activity
的onStop()
方法中调用AsyncTask
的cancel(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
响应的类。 这就是我在Activity
和Service
之间进行通信的方式。
我使用以下代码启动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.