2012-02-01 81 views
1

在我的應用程序中,我想在兩個活動之間傳遞Parcelable對象(或Parcelable[])的ArrayList。在第一個活動中,我調用restservice來獲取json數據,然後使用gson獲取ListParcelable對象,然後使用putParcelableArrayListExtra(...)將該列表發送到第二個活動。所有的工作都很好,直到列表的大小大約爲1000,但超過這個大小,我得到一個ANR,即使我等了幾分鐘,應用程序也不會恢復。Android使用Parcelable在活動之間發送數據

有沒有解決這個問題的方法?是否由於將對象放置到意圖的大小限制?

我知道我可以通過JSON字符串,然後獲得第二個活動的列表,但我更喜歡先做這種操作。

回答

0

首先,確保您的ANR的確實是可以放大的大對象,而不是因爲您正在主線程上執行阻塞操作(即聯網)。

現在,如果ANR問題確實是由於這些大對象,完成這件事的正確方法是反序列化對象並寫入到存儲代替傳遞活動之間的。通過做你正在做的事情,你實際上將內存量翻了一番。

這裏有一些方法可以解決此:

  • StrictMode: StrictMode最常用來捕捉偶然的磁盤或網絡訪問應用程序的主線程,在UI操作接收和動畫上發生。通過保持應用程序的主線程響應,您還可以阻止向用戶顯示ANR對話框。

  • Traceview: Traceview是一個圖形瀏覽器,用於查看由Android應用程序創建的日誌。通過Traceview,您可以在應用程序中發現錯誤並測量其性能。

  • Memory Dump:您可以創建內存快照並使用Eclipse Memory Analyzer進行分析。

+0

我敢肯定,ANR是由於大parcelable因爲網絡的要求完成成的AsyncTask和retreiving結果後,我把結果的意圖,並開始新的活動,這將不會出現。 .. – danidif 2012-02-02 16:01:04

+0

@danidif然後,如果是這樣的話,你必須排除故障,看看究竟發生了什麼(使用StrictMode,Traceview等)。我懷疑你的內存不足,這就是爲什麼我建議反序列化(並寫入存儲)而不是傳遞它。 – 2012-02-02 16:07:39

+0

它也嘗試將整個json strig傳遞給Intent,並在第二個活動中使用gson獲取對象,結果是:JAVA FAILED BINDER TRANSACTION ... – danidif 2012-02-02 16:12:12

相關問題