2016-07-13 31 views
2

我有一個奇怪的情況,我的應用程序有時會崩潰(比如在做了將近20次事務後),但在調試模式下,即使在仿真器中也沒有發生崩潰。 我也增加了我的堆內存。應用程序崩潰了一段時間,但沒有在調試模式

日誌錯誤我附加了這裏:

07-20 11:27:39.207: E/AndroidRuntime(17877): FATAL EXCEPTION: main 
07-20 11:27:39.207: E/AndroidRuntime(17877): java.lang.OutOfMemoryError 
07-20 11:27:39.207: E/AndroidRuntime(17877): at java.util.ArrayList.toArray(ArrayList.java:492) 
07-20 11:27:39.207: E/AndroidRuntime(17877): at java.util.ArrayList.<init>(ArrayList.java:93) 
07-20 11:27:39.207: E/AndroidRuntime(17877): at com.mis.adapter.MicListAdapter.<init>(MicListAdapter.java:52) 
07-20 11:27:39.207: E/AndroidRuntime(17877): at com.mis.controller.InventoryCount$InflateList.onPostExecute(InventoryCount.java:3061) 
07-20 11:27:39.207: E/AndroidRuntime(17877): at com.mis.controller.InventoryCount$InflateList.onPostExecute(InventoryCount.java:1) 
07-20 11:27:39.207: E/AndroidRuntime(17877): at android.os.AsyncTask.finish(AsyncTask.java:631) 
07-20 11:27:39.207: E/AndroidRuntime(17877): at android.os.AsyncTask.access$600(AsyncTask.java:177) 
07-20 11:27:39.207: E/AndroidRuntime(17877): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
07-20 11:27:39.207: E/AndroidRuntime(17877): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-20 11:27:39.207: E/AndroidRuntime(17877): at android.os.Looper.loop(Looper.java:137) 
07-20 11:27:39.207: E/AndroidRuntime(17877): at android.app.ActivityThread.main(ActivityThread.java:4895) 
07-20 11:27:39.207: E/AndroidRuntime(17877): at java.lang.reflect.Method.invokeNative(Native Method) 
07-20 11:27:39.207: E/AndroidRuntime(17877): at java.lang.reflect.Method.invoke(Method.java:511) 
07-20 11:27:39.207: E/AndroidRuntime(17877): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994) 
07-20 11:27:39.207: E/AndroidRuntime(17877): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761) 
07-20 11:27:39.207: E/AndroidRuntime(17877): at dalvik.system.NativeStart.main(Native Method) 

在這裏,我附上我onPostMethod()

protected void onPostExecute(List<MIC_OrderDetails> lst) { 
      dialog.setMessage("Inflating Data..."); 
      if (lst.get(lst.size() - 1).getResult().contains(("success"))) { 
       ordList = new MicListAdapter(InventoryCount.this, lst); 
       lstView.setAdapter(ordList); 
       dialog.dismiss(); 
      } else { 
       dialog.dismiss(); 
       toastText.setText("Problem in loading Items"); 
       Toast toast = new Toast(getApplicationContext()); 
       toast.setGravity(Gravity.CENTER_VERTICAL, 0, 410); 
       toast.setDuration(Toast.LENGTH_LONG); 
       toast.setView(toastLayout); 
       toast.show(); 
      } 
     } 
+0

你能顯示你的適配器嗎? – Charu

+0

如果您的數據很大,請不要將所有內容加載到內存中。爲什麼不使用加載更多按鈕來批量加載數據?我不確定您擁有的數據的大小,但這通常是加載大量數據時的最佳做法。 – chejaras

+0

你有明顯的錯誤java.lang.OutOfMemoryError。所以你編寫了耗盡的堆內存。問題可能是一個MemoryLeak,但如果你說在調試模式下沒問題...我希望你的GarbageCollector不能像分配新內存一樣快(或堆在最大)...指向配置問題。無論如何,你應該減少創建對象(重新使用舊的),並儘快拋出不必要的(設置爲空) – Perlos

回答

9

不要在onPostExecute()方法再重新創建適配器。而是在onCreate()方法中創建一次適配器,並在onPostExecute()方法中使用adapter.notifyDatasetChanged()。事情是這樣的,

創建數據集list爲類變量和onCreate()像在此之前進行初始化,

List<MIC_OrderDetails> list = new ArrayList<MIC_OrderDetails>(); 

內onCreate方法初始化適配,

adapter = new MicListAdapter(InventoryCount.this, list); 
lstView.setAdapter(adapter); 

內onPostExecute方法,

protected void onPostExecute(List<MIC_OrderDetails> lst) { 
    dialog.setMessage("Inflating Data..."); 
    if (lst.get(lst.size() - 1).getResult().contains(("success"))) { 
     list.clear(); 
     list.addAll(lst); 
     adapter.notifyDataSetChanged(); 
     dialog.dismiss(); 
    } else { 
     dialog.dismiss(); 
     toastText.setText("Problem in loading Items"); 
     Toast toast = new Toast(getApplicationContext()); 
     toast.setGravity(Gravity.CENTER_VERTICAL, 0, 410); 
     toast.setDuration(Toast.LENGTH_LONG); 
     toast.setView(toastLayout); 
     toast.show(); 
    } 
} 
+1

每當應用程序進入這個屏幕,我從數據庫中獲取數據並在Listview中充氣它。因此,如果數據是巨大的,它不會阻礙主UI線程。所以我已經創建了onPostExcute方法中的adpter ..請糾正我,如果我錯了任何地方.. –

+0

@K Nerraj拉爾我試過你的方式,但仍然內存不足堅持..任何想法? –

+0

@PraneshSahu崩潰日誌是否仍然相同?請更新代碼。 –

0

if yo您必須處理大量數據,請在AndroidManifest.xml中添加android:largeHeap="true"

相關問題