我有一个显示列表视图的活动。在项目单击时,将启动第二个活动,该活动运行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
答案 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的原因而言,由你决定。