2016-07-13 32 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"

相关问题