Android:在asynctask期间处理后退按钮

时间:2011-03-15 20:50:09

标签: android

我有一个显示列表视图的活动。在项目单击时,将启动第二个活动,该活动运行AsyncTask,该AsyncTask根据单击的项目获取远程URL,解析结果,然后将这些结果显示到另一个列表视图中。当异步任务正在运行时,我有一个“加载”视图,只显示图像和文本。问题是如果我启动运行异步任务的活动,然后按回并启动所述活动的另一个实例,我就会关闭一个力。

我试过了

private class getlist extends AsyncTask implements OnDismissListener{
     ...
     @Override
     public void onDismiss(DialogInterface arg0) {
          this.cancel(true);
     }
}

但问题仍然存在。

我也提出了

if(!isCancelled()){
  setContentView(R.layout.list);
  ...
  etc.

}

进入我的onPostExecute调用,但这不是阻止视图被切换,或者问题是其他的。

logcat显示“已恢复时意外恢复..得到RemoteException发送setActive(false)通知” 然后在日志中进一步向下,“java.net.SocketTimeoutException:Socket未连接”

我该如何解决这个问题?

更新

E/AndroidRuntime(19379): Uncaught handler: thread AsyncTask #2 exiting due to uncaught exception
E/AndroidRuntime(19379): java.lang.RuntimeException: An error occured while executing doInBackground()
E/AndroidRuntime(19379):        at android.os.AsyncTask$3.done(AsyncTask.java:200)
E/AndroidRuntime(19379):        at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
E/AndroidRuntime(19379):        at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
E/AndroidRuntime(19379):        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
E/AndroidRuntime(19379):        at java.util.concurrent.FutureTask.run(FutureTask.java:137)
E/AndroidRuntime(19379):        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
E/AndroidRuntime(19379):        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
E/AndroidRuntime(19379):        at java.lang.Thread.run(Thread.java:1096)
E/AndroidRuntime(19379): Caused by: java.lang.NullPointerException
E/AndroidRuntime(19379):        at com.metatroid.android.swim.ThreadViewer.getPosts(ThreadViewer.java:153)
E/AndroidRuntime(19379):        at com.metatroid.android.swim.ThreadViewer$getlist.doInBackground(ThreadViewer.java:70)
E/AndroidRuntime(19379):        at com.metatroid.android.swim.ThreadViewer$getlist.doInBackground(ThreadViewer.java:1)
E/AndroidRuntime(19379):        at android.os.AsyncTask$2.call(AsyncTask.java:185)
E/AndroidRuntime(19379):        at java.util.concurrent.FutureTask$Sync.innerRun

2 个答案:

答案 0 :(得分:38)

此问题的实际解决方案是将ThreadSafeClientConnManager用于ClientConnectionManager

e.g。

BasicHttpParams params = new BasicHttpParams();
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
final SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory();
schemeRegistry.register(new Scheme("https", sslSocketFactory, 443));
ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);
DefaultHttpClient httpclient = new DefaultHttpClient(cm, params);

答案 1 :(得分:6)

请勿从doInBackground()访问活动。访问onPostExecute()publishProgress()onPreExecute()中的活动是安全的,即使这样,只需要小心处理配置更改等。

我建议你让getlist成为一个静态的内部类,而不是一个普通的内部类。手动关联任务和活动,并在销毁活动或更改其配置时中断该关联。在尝试使用之前,您的onPostExecute()和亲属应检查以确保其具有有效活动。

This sample application演示了部分内容 - 处理配置更改。它没有显式处理BACK按钮场景,但它不需要,因为它只是更新屏幕外的活动。

getPosts()有NullPointerException的原因而言,由你决定。