Android:在asynctask期间处理后退按钮

ape*_*ure 14 android

我有一个显示列表视图的活动.在项目单击时,将启动第二个活动,该活动运行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);

  • 遇到"java.lang.IllegalStateException:Adapter is detached".在尝试连接到服务器时.这种方法解决了它.谢谢 (2认同)

Com*_*are 6

不要访问活动doInBackground().只有在处理配置更改等情况下onPostExecute(),才能安全地访问publishProgress(),或者onPreExecute(),甚至只需要处理配置更改等.

我建议你做getlist一个静态的内部类,而不是一个普通的内部类.手动关联任务和活动,并在销毁活动或更改其配置时中断该关联.onPostExecute()在尝试使用之前,您和亲属应检查以确保其具有有效活动.

此示例应用程序演示了部分内容 - 处理配置更改.它没有显式处理BACK按钮场景,但它不需要,因为它只是更新屏幕外的活动.

就为什么getPosts()有NullPointerException而言,由你来决定.