我有一个显示列表视图的活动.在项目单击时,将启动第二个活动,该活动运行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
ape*_*ure 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);
不要访问活动doInBackground().只有在处理配置更改等情况下onPostExecute(),才能安全地访问publishProgress(),或者onPreExecute(),甚至只需要处理配置更改等.
我建议你做getlist一个静态的内部类,而不是一个普通的内部类.手动关联任务和活动,并在销毁活动或更改其配置时中断该关联.onPostExecute()在尝试使用之前,您和亲属应检查以确保其具有有效活动.
此示例应用程序演示了部分内容 - 处理配置更改.它没有显式处理BACK按钮场景,但它不需要,因为它只是更新屏幕外的活动.
就为什么getPosts()有NullPointerException而言,由你来决定.
| 归档时间: |
|
| 查看次数: |
8250 次 |
| 最近记录: |