2011-02-24 83 views
0

我正在寫一個可以啓用網絡的應用程序和改進的用戶體驗我正在使用各種併發結構。來自網絡的信息包含圖像的文本項目和URL。我目前以阻塞的方式獲取圖像,而不會產生新的線索來獲取圖像。這工作正常,但我意識到,我可以通過產生另一個線程來獲取圖像,使事情變得更快捷。我解決了一個線程池與2個工作線程處理這個任務,但現在我有應用程序崩潰間歇性問題。這似乎是隨機發生的,我不知道到底發生了什麼問題。所以這裏是我目前如何做的事情:安卓隨機崩潰併發問題

  1. 用戶點擊搜索,併產生一個新的AsyncTask獲取所需的信息。

  2. 在新的AsyncTask信息開始流入。只要有足夠的信息可用於單個項目,我們將該項目添加到列表適配器,跳轉到主線程並調用notifyDataSetChanged()來更新列表。我們還會向線索池提交任務以獲取圖像,並在圖像準備就緒後立即致電notifyDataSetChanged()

  3. 繼續更新列表,直到沒有更多項目要處理。

我覺得我的設置是相當不錯的,但我想對於提高我該怎麼做的事情,也許一些指針追查是什麼導致了崩潰的一些建議。

這裏的一個logcat的輸出:

02-23 21:30:20.303:DEBUG/AndroidRuntime(1209):關閉VM 02-23 21:30:20.313:WARN/dalvikvm(1209) :線程ID = 1:未捕獲的異常線程退出(組= 0x4001d800) 02-23 21:30:20.342:ERROR/AndroidRuntime(1209):致命異常:主 02-23 21:30:20.342:ERROR/AndroidRuntime( 1209):java.lang.IllegalStateException:適配器的內容已更改,但ListView未收到通知。確保適配器的內容不會從後臺線程修改,而只能從UI線程修改。 [在ListView(16908298,類android.widget.ListView)與適配器(類android.widget.HeaderViewListAdapter)] 02-23 21:30:20.342:錯誤/ AndroidRuntime(1209):在android.widget.ListView.layoutChildren ListView.java:1492) 02-23 21:30:20.342:ERROR/AndroidRuntime(1209):在android.widget.AbsListView.onLayout(AbsListView.java:1147) 02-23 21:30:20.342:ERROR/AndroidRuntime(1209):at android.view.View.layout(View.java:7035) 02-23 21:30:20.342:ERROR/AndroidRuntime(1209):at android.widget.LinearLayout.setChildFrame(LinearLayout.java: 1249) 02-23 21:30:20.342:ERROR/AndroidRuntime(1209):在android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125) 02-23 21:30:20.342:ERROR/AndroidRuntime(1209) :在android.widget.LinearLayout.onLayout(LinearLayout.java:1042) 02-23 21:30:20.342:錯誤/ AndroidRuntime(1209):at android.view.View.layout(View.java:7035) 02-23 21:30:20.342:ERROR/AndroidRuntime(1209):at android .widget.FrameLayout.onLayout(FrameLayout.java:333) 02-23 21:30:20.342:ERROR/AndroidRuntime(1209):在android.view.View.layout(View.java:7035) 02-23 21 :30:20.342:ERROR/AndroidRuntime(1209):在android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249) 02-23 21:30:20.342:ERROR/AndroidRuntime(1209):在android.widget.LinearLayout .layoutVertical(LinearLayout.java:1125) 02-23 21:30:20.342:ERROR/AndroidRuntime(1209):在android.widget.LinearLayout.onLayout(LinearLayout.java:1042) 02-23二十一點30分二十零秒。342:錯誤/ AndroidRuntime(1209):在android.view.View.layout(View.java:7035) 02-23 21:30:20.342:錯誤/ AndroidRuntime(1209):在android.widget.FrameLayout.onLayout FrameLayout.java:333) 02-23 21:30:20.342:ERROR/AndroidRuntime(1209):at android.view.View.layout(View.java:7035) 02-23 21:30:20.342:ERROR/AndroidRuntime(1209):at android.view.ViewRoot.performTraversals(ViewRoot.java:1045) 02-23 21:30:20.342:ERROR/AndroidRuntime(1209):at android.view.ViewRoot.handleMessage(ViewRoot.java: 1727) 02:21:30:20.342:ERROR/AndroidRuntime(1209):at android.os.Handler.dispatchMessage(Handler.java:99) 02-23 21:30:20.342:ERROR/AndroidRuntime(1209) :在android.os.Looper.loop(Looper.java:123) 02-23 21:30:20.342:錯誤/ AndroidRuntime(1209):在android.app.ActivityThread。 main(ActivityThread.java:4627) 02-23 21:30:20.342:ERROR/AndroidRuntime(1209):at java.lang.reflect.Method.invokeNative(Native Method) 02-23 21:30:20.342:ERROR/AndroidRuntime(1209):at java.lang.reflect.Method.invoke(Method.java:521) 02-23 21:30:20.342:ERROR/AndroidRuntime(1209):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868) 02-23 21:30:20.342:ERROR/AndroidRuntime(1209):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 02- 23 21:30:20.342:ERROR/AndroidRuntime(1209):at dalvik.system.NativeStart.main(Native Method) 02-23 21:30:20.402:WARN/ActivityManager(72):強制整理活動com.daveco。 pricewatcher/.SearchActivity

+0

你能爲你提供logcat輸出嗎? – ingsaurabh 2011-02-24 05:19:57

回答

3

聽起來像一個項目變得可用時,您正在從AsyncTask中的工作線程更新列表適配器。在UI線程中遍歷相同的適配器以呈現列表。這可能會導致隨機崩潰,因爲您可能正在更新下一個項目的列表適配器,而它仍然響應較早的notifyDataSetChanged()

更新列表適配器的更好方法是使用處理程序在UI線程中發佈可更新列表適配器並調用notifyDataSetChanged()

圖像更新可能會有類似的事情發生。

作爲一般策略,UI所依賴的任何數據結構都應在UI線程上更新。它往往更安全。另一種策略是仔細同步代碼的關鍵部分,但這樣做很難做到。

+0

我正在使用處理程序發佈帶有'notifyDataSetChanged()'的runnable,但我認爲你可能是正確的更新和數據更改發生在同一時間,所以我會開始尋找。 – davidk01 2011-02-24 05:37:11

+0

你說得對。我通過移動一些碎片來解決問題。 – davidk01 2011-02-24 09:10:14