Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:异步任务期间处理后退按钮_Android - Fatal编程技术网

Android:异步任务期间处理后退按钮

Android:异步任务期间处理后退按钮,android,Android,我有一个显示listview的活动。单击项目时,启动第二个活动,该活动运行异步任务,该任务根据单击的项目获取远程URL,解析结果,然后将这些结果显示到另一个列表视图中。当异步任务运行时,我有一个“加载”视图,它只显示一个图像和文本。问题是,如果我启动运行异步任务的活动,然后按back并启动所述活动的另一个实例,我会得到一个强制关闭 我尝试过私有类getlist扩展AsyncTask实现OnDismissListener{ private class getlist extends AsyncTa

我有一个显示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)
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);