【问题标题】:Memory issue/ Cursor shows null pointer内存问题/光标显示空指针
【发布时间】:2011-06-29 12:33:44
【问题描述】:

我正在获取联系人的姓名和电子邮件 ID,它在 HTC Desire 中运行良好,但每当我尝试在 Galaxy 选项卡中运行代码时,它都会显示 memObj 中没有内存和空指针...而(emailCur .moveToNext()) .

这是我的代码

private void getPeopleList() {
    String name, email;
    Runtime.getRuntime().maxMemory();
    c = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    if (c.getCount() > 0) {
        while (c.moveToNext()) {

            name = c.getString(c
                    .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

            String id = c.getString(c
                    .getColumnIndex(BaseColumns._ID));
            cr.query(
                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    null,
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                            + " = ?", new String[] { id }, null);


             emailCur = cr.query(Email.CONTENT_URI, null,
                    Email.CONTACT_ID + " = " + id, null, null);

            int j = 0;

            while (emailCur.moveToNext()) {

                bindData = new BindData[emailCur.getCount()];
                bindData = new BindData();
                email = emailCur
                        .getString(emailCur
                                .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));

                bindData.setEmailId(email);
                bindData.setName(name);
                Log.d("doubt : ", name+"//"+email);
                mArrayList.add(bindData);
                j++;


            }
            emailCur.close();                   
        }
        c.close();

    }


}

我正在使用可运行的工作线程调用此方法。

如果需要任何信息,请告诉我。

这是我的日志猫

06-29 16:13:26.854: ERROR/IMemory(6180): binder=0xdf3f68 transaction failed    fd=-2147483647, size=0, err=-2147483646 (Unknown error: 2147483646)
06-29 16:13:26.854: ERROR/IMemory(6180): cannot dup fd=-2147483647, size=0, err=-2147483646 (Bad file number)
06-29 16:13:26.854: ERROR/IMemory(6180): cannot map BpMemoryHeap (binder=0xdf3f68), size=0, fd=-1 (Bad file number)
06-29 16:13:26.854: ERROR/JavaBinder(6180): *** Uncaught remote exception!  (Exceptions are not yet supported across processes.)
06-29 16:13:26.854: ERROR/JavaBinder(6180): java.lang.RuntimeException: No memory in memObj
06-29 16:13:26.854: ERROR/JavaBinder(6180):     at android.database.CursorWindow.native_init(Native Method)
06-29 16:13:26.854: ERROR/JavaBinder(6180):     at android.database.CursorWindow.<init>(CursorWindow.java:518)
06-29 16:13:26.854: ERROR/JavaBinder(6180):     at android.database.CursorWindow.<init>(CursorWindow.java:27)
06-29 16:13:26.854: ERROR/JavaBinder(6180):     at android.database.CursorWindow$1.createFromParcel(CursorWindow.java:493)
06-29 16:13:26.854: ERROR/JavaBinder(6180):     at android.database.CursorWindow$1.createFromParcel(CursorWindow.java:496)
06-29 16:13:26.854: ERROR/JavaBinder(6180):     at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:103)
06-29 16:13:26.854: ERROR/JavaBinder(6180):     at android.os.Binder.execTransact(Binder.java:288)
06-29 16:13:26.854: ERROR/JavaBinder(6180):     at dalvik.system.NativeStart.run(Native Method)
06-29 16:13:26.858: ERROR/AndroidRuntime(6388): FATAL EXCEPTION: main
06-29 16:13:26.858: ERROR/AndroidRuntime(6388): java.lang.NullPointerException
06-29 16:13:26.858: ERROR/AndroidRuntime(6388):     at com.meomyo.fanaticfaninit.utils.MyCustomList.getPeopleList(MyCustomList.java:172)
06-29 16:13:26.858: ERROR/AndroidRuntime(6388):     at com.meomyo.fanaticfaninit.utils.MyCustomList.access$0(MyCustomList.java:144)
06-29 16:13:26.858: ERROR/AndroidRuntime(6388):     at com.meomyo.fanaticfaninit.utils.MyCustomList$1.run(MyCustomList.java:121)
06-29 16:13:26.858: ERROR/AndroidRuntime(6388):     at android.os.Handler.handleCallback(Handler.java:587)
06-29 16:13:26.858: ERROR/AndroidRuntime(6388):     at android.os.Handler.dispatchMessage(Handler.java:92)
06-29 16:13:26.858: ERROR/AndroidRuntime(6388):     at android.os.Looper.loop(Looper.java:123)
06-29 16:13:26.858: ERROR/AndroidRuntime(6388):     at android.app.ActivityThread.main(ActivityThread.java:4627)
06-29 16:13:26.858: ERROR/AndroidRuntime(6388):     at java.lang.reflect.Method.invokeNative(Native Method)
06-29 16:13:26.858: ERROR/AndroidRuntime(6388):     at java.lang.reflect.Method.invoke(Method.java:521)
06-29 16:13:26.858: ERROR/AndroidRuntime(6388):     at 

【问题讨论】:

  • 崩溃在哪一行?
  • @Nic: while(emailCur.moveToNext()).

标签: android memory memory-management memory-leaks nullpointerexception


【解决方案1】:

请你试试

if (emailCur.moveToFirst()) {
do {

} while (emailCur.moveToNext());
}

而不是emailCur.moveToNext()

【讨论】:

  • 不工作..其他任何事情....我认为这不会成为问题...感谢您的回答。
  • 你能把你的logcat过去吗?
  • @Nick:在 emailCur 里面我可以看到日志 Log.d("doubt : ", name+"//"+email);我能够得到姓名和电子邮件 ID,但最后我得到了这个错误。
  • @PiyushMishra 你能告诉我什么是 bindData 吗?在你的代码中,因为我把你的代码,但得到编译错误 bindData..
  • @Nick:是的 BindData 只是一个具有 getter setter 方法的简单类。这个简单的代码不会起作用,因为它只是我课程的一部分,我也在使用自定义适配器来显示我得到的数据。但我认为适配器不会在任何地方造成任何问题。如果您需要任何代码,请告诉我。
【解决方案2】:

得到答案:问题出在我目前正在使用的 ArrayList(mArraylist) 上,我也在通过我的适配器传递这个 arraylist,这就是将对象保存得太久而不是 arraylist 的原因。所以这里的解决方案是创建一个 Dummy ArrayList 将您的数据放入其中,并在将 ArrayList 传递到适配器时将其复制到原始 ArrayList 中。

这是代码。

ArrayList<BindData> dummyArrayList= new ArrayList<BindData>

在while循环中

dummyArrayList.add(bindData);

在创建 Adapter 实例之前,将此 Dummy ArrayList 复制到原始 ArrayList(您要传递给 Adapter 的列表)

  new Thread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            getPeopleList();
            runOnUiThread(new Runnable() {                  
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    mArrayList.clear();
                    for(int i = 0; i < dummyArrayList.size(); i++){
                        mArrayList.add(dummyArrayList.get(i));
                    }
                    dummyArrayList.clear();
                    myAdapter.notifyDataSetChanged();
                    progressDialog.cancel();
                }
            });
        }
    }).start();

之后,您可以通过在其中传递原始 Arraylist 来创建适配器实例。

  MyAdapter myAdapter= new MyAdapter(this, R.layout.contactlistrow, mArrayList);

它会正常工作的。

谢谢

【讨论】:

  • 再找一个答案:删除这段代码“ cr.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { id }, null);" 然后它又可以正常工作了:)。
猜你喜欢
  • 1970-01-01
  • 2018-02-09
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多