Android:异步任务期间处理后退按钮
我有一个显示listview的活动。单击项目时,启动第二个活动,该活动运行异步任务,该任务根据单击的项目获取远程URL,解析结果,然后将这些结果显示到另一个列表视图中。当异步任务运行时,我有一个“加载”视图,它只显示一个图像和文本。问题是,如果我启动运行异步任务的活动,然后按back并启动所述活动的另一个实例,我会得到一个强制关闭 我尝试过私有类getlist扩展AsyncTask实现OnDismissListener{ private class getlist extends AsyncTask implements OnDismissListener{ ... @Override public void onDismiss(DialogInterface arg0) { this.cancel(true); } } ... @凌驾 public void onDismiss(对话框接口arg0){ 这个。取消(true); } } 但问题依然存在 我也把 if(!isCancelled()){ setContentView(R.layout.list); ... etc. } 如果(!isCancelled()){ setContentView(R.layout.list); ... 等 } 进入我的onPostExecute调用,但这不是阻止视图被切换,或者问题是其他原因 logcat显示“已恢复时意外恢复..收到RemoteException发送setActive(false)通知” 然后在日志中再往下一点,“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 E/AndroidRuntime(19379):未捕获处理程序:线程异步任务#2由于未捕获异常而退出 E/AndroidRuntime(19379):java.lang.RuntimeException:执行doInBackground()时出错 E/AndroidRuntime(19379):在android.os.AsyncTask$3.done(AsyncTask.java:200) E/AndroidRuntime(19379):位于java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) E/AndroidRuntime(19379):位于java.util.concurrent.FutureTask.setException(FutureTask.java:124) E/AndroidRuntime(19379):位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) E/AndroidRuntime(19379):在java.util.concurrent.FutureTask.run(FutureTask.java:137) E/AndroidRuntime(19379):位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) E/AndroidRuntime(19379):位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) E/AndroidRuntime(19379):在java.lang.Thread.run(Thread.java:1096) E/AndroidRuntime(19379):由以下原因引起:java.lang.NullPointerException E/AndroidRuntime(19379):位于com.metatroid.android.swim.ThreadViewer.getPosts(ThreadViewer.java:153) E/AndroidRuntime(19379):位于com.metatroid.android.swim.ThreadViewer$getlist.doInBackground(ThreadViewer.java:70) E/AndroidRuntime(19379):位于com.metatroid.android.swim.ThreadViewer$getlist.doInBackground(ThreadViewer.java:1) E/AndroidRuntime(19379):在android.os.AsyncTask$2.call(AsyncTask.java:185)Android:异步任务期间处理后退按钮,android,Android,我有一个显示listview的活动。单击项目时,启动第二个活动,该活动运行异步任务,该任务根据单击的项目获取远程URL,解析结果,然后将这些结果显示到另一个列表视图中。当异步任务运行时,我有一个“加载”视图,它只显示一个图像和文本。问题是,如果我启动运行异步任务的活动,然后按back并启动所述活动的另一个实例,我会得到一个强制关闭 我尝试过私有类getlist扩展AsyncTask实现OnDismissListener{ private class getlist extends AsyncTa
E/AndroidRuntime(19379):在java.util.concurrent.FutureTask$Sync.innerRun中,不要从
doInBackground()访问活动。只有在onPostExecute()
、publishProgress()
或onPreExecute()
中访问活动才是安全的,即使这样,也要小心处理配置更改等
我建议将getlist
设置为静态内部类,而不是常规内部类。手动关联任务和活动,并在活动被销毁或其配置更改时中断该关联。然后,您的onPostExecute()
和kin应该在尝试使用它之前检查以确保它具有有效的活动
演示其中的一部分--处理配置更改。它不显式地处理后退按钮场景,但不需要,因为它只更新屏幕外的活动
至于为什么getPosts()
会出现NullPointerException,这要由您来确定。这个问题的实际解决方案是对ClientConnectionManager使用ThreadSafeClientConnManager
e、 g
BasicHttpParams params=新的BasicHttpParams();
SchemeRegistry SchemeRegistry=新SchemeRegistry();
register(新方案(“http”,PlainSocketFactory.getSocketFactory(),80));
最终SSLSocketFactory SSLSocketFactory=SSLSocketFactory.getSocketFactory();
注册(新方案(“https”,sslSocketFactory,443));
ClientConnectionManager cm=新的ThreadSafeClientConnManager(参数,schemeRegistry);
DefaultHttpClient httpclient=新的DefaultHttpClient(cm,参数);
如果您正确阅读LogCat,则您的错误与此无关,而是在您尝试下载数据时出现的网络问题。@Commonware-我已用我认为正确的traceThanks更新了问题。我会想办法解决这个问题。我有大约四天的Java经验,所以我正在努力做的很多事情都是非常陌生的。NullPointerException指向一行,在该行中,我正在设置后台任务中的标题字符串。删除该行仍然会给我留下一个错误,但现在它在logcat中显示:“IllegalStateException:无包装连接”或“IllegalStateException:适配器已分离”@aperture:如果您只有四天的Java经验,那么您将对这里讨论的内容感到非常困惑。无意冒犯,但这会让经验丰富的Java和Android开发人员感到困惑。您可能希望从一开始就从一个更简单的项目开始。好吧,除了这个问题之外,一切都很顺利。我可以在同样使用asynctasks的其他活动之间切换,而且如果在启动下一个实例之前等待几秒钟,我甚至可以在这个麻烦的活动之间切换。当然,如果我在退出活动之前等待“getPosts()”完成,就不会有问题。但我明白,我对Java非常缺乏经验。在尝试连接到服务器时遇到“Java.lang.IllegalStateException:适配器已分离”。这种方法解决了这个问题。ThanksI也有同样的问题
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);