2011-03-15 98 views
14

我有一個顯示列表視圖的活動。在項目單擊時,將啓動第二個活動,該活動運行一個AsyncTask,根據哪個項目被點擊來獲取遠程URL,解析結果,然後將這些結果顯示到另一個列表視圖中。異步任務正在運行時,我有一個「加載」視圖,只顯示圖像和文本。問題是,如果我啓動運行異步任務的活動,然後按回來並啓動所述活動的另一個實例,則會關閉部隊。Android:在asynctask中處理後退按鈕

我已經試過

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(假)的通知」 然後遠一點的日誌中了,「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
+0

您的錯誤,如果您正在閱讀LogCat,與此無關,而是嘗試下載數據時出現網絡問題。 – CommonsWare 2011-03-15 21:57:15

+0

@CommonsWare - 我已更新與我相信是正確的跟蹤的問題 – aperture 2011-03-15 22:07:38

回答

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); 
+2

遇到「java.lang.IllegalStateException:適配器已分離」。同時嘗試連接到服務器。這種方法解決了它。謝謝 – 2011-05-08 06:34:41

+0

我有同樣的問題,現在已修復,謝謝。你能解釋一下你是怎麼想出這個解決方案的?因爲它對我來說似乎是一個補丁,它有點有趣。再次感謝。 – Rami 2012-06-26 01:11:10

+0

我有Java.lang.IllegalException。由此解決。 – Hema 2012-06-29 07:21:26

6

不要doInBackground()訪問活動。它是唯一安全的只有一些小心處理的配置變化等訪問活動onPostExecute()publishProgress(),或onPreExecute(),甚則

我會建議你做getlist是靜態內部類,而不是定期內班。手動關聯任務和活動,並在活動被銷燬或其配置更改時中斷該關聯。然後,您的onPostExecute()和親屬應該在嘗試使用之前檢查並確保其有效。

This sample application演示了其中的一部分 - 處理配置更改。它沒有明確處理BACK按鈕場景,但它不需要,因爲它僅僅更新了一個不在屏幕上的活動。

在爲什麼getPosts()有一個NullPointerException,這是由你決定。

+0

謝謝。我會試圖找出如何做到這一點。我有大約四天的Java經驗,所以我努力做的很多事情都是非常陌生的。 NullPointerException指向一條線,我從後臺任務中設置標題字符串。刪除該行仍然給我一個錯誤,但現在它在logcat中說:「IllegalStateException:沒有被包裝的連接」或「IllegalStateException:適配器被分離」 – aperture 2011-03-15 22:53:26

+0

@aperture:如果你只有四天的Java經驗,你將要用你在這裏談論的東西來解決你的問題。沒有冒犯性,但這些東西會讓經驗豐富的Java和Android開發人員感到困惑。一開始您可能希望從一個更簡單的項目開始。 – CommonsWare 2011-03-15 23:02:45

+0

好吧,除了這個問題,一切都很好。我可以在其他同樣使用asynctasks的活動之間進行切換,如果在啓動下一個實例之前等待幾秒鐘,我甚至可以在這個麻煩的活動之間切換。當然,如果我在退出活動之前等待'getPosts()'完成,則沒有任何問題。但我明白,我對Java很缺乏經驗。 – aperture 2011-03-15 23:27:26