2011-03-15 95 views
14

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

我已经试过

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(假)的通知” 然后远一点的日志中了,“java.net.SocketTimeoutException:套接字未连接”

如何我能解决这个问题吗?

更新:

 
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
+0

您的错误,如果您正在阅读LogCat,与此无关,而是尝试下载数据时出现网络问题。 – CommonsWare 2011-03-15 21:57:15

+0

@CommonsWare - 我已更新与我相信是正确的跟踪的问题 – aperture 2011-03-15 22:07:38

回答

38

实际解决这个问题是使用ThreadSafeClientConnManager用于ClientConnectionManager

例如

 
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); 
+2

遇到“java.lang.IllegalStateException:适配器已分离”。同时尝试连接到服务器。这种方法解决了它。谢谢 – 2011-05-08 06:34:41

+0

我有同样的问题,现在已修复,谢谢。你能解释一下你是怎么想出这个解决方案的?因为它对我来说似乎是一个补丁,它有点有趣。再次感谢。 – Rami 2012-06-26 01:11:10

+0

我有Java.lang.IllegalException。由此解决。 – Hema 2012-06-29 07:21:26

6

不要doInBackground()访问活动。它是唯一安全的只有一些小心处理的配置变化等访问活动onPostExecute()publishProgress(),或onPreExecute(),甚则

我会建议你做getlist是静态内部类,而不是定期内班。手动关联任务和活动,并在活动被销毁或其配置更改时中断该关联。然后,您的onPostExecute()和亲属应该在尝试使用之前检查并确保其有效。

This sample application演示了其中的一部分 - 处理配置更改。它没有明确处理BACK按钮场景,但它不需要,因为它仅仅更新了一个不在屏幕上的活动。

在为什么getPosts()有一个NullPointerException,这是由你决定。

+0

谢谢。我会试图找出如何做到这一点。我有大约四天的Java经验,所以我努力做的很多事情都是非常陌生的。 NullPointerException指向一条线,我从后台任务中设置标题字符串。删除该行仍然给我一个错误,但现在它在logcat中说:“IllegalStateException:没有被包装的连接”或“IllegalStateException:适配器被分离” – aperture 2011-03-15 22:53:26

+0

@aperture:如果你只有四天的Java经验,你将要用你在这里谈论的东西来解决你的问题。没有冒犯性,但这些东西会让经验丰富的Java和Android开发人员感到困惑。一开始您可能希望从一个更简单的项目开始。 – CommonsWare 2011-03-15 23:02:45

+0

好吧,除了这个问题,一切都很好。我可以在其他同样使用asynctasks的活动之间进行切换,如果在启动下一个实例之前等待几秒钟,我甚至可以在这个麻烦的活动之间切换。当然,如果我在退出活动之前等待'getPosts()'完成,则没有任何问题。但我明白,我对Java很缺乏经验。 – aperture 2011-03-15 23:27:26