-1

每当单击 Tab 时,我都会从手机加载联系人列表。第一次触摸它工作正常,但第二次会导致内存问题。我应该如何防止这个问题?

这是代码。

String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
            + " COLLATE LOCALIZED ASC";
try {
        contactsCursor= getContentResolver()
        .query(uri, null, null, null,  sortOrder);

        //Log.i("The first one", "" + contactsCursor.getCount());
        if(contactsCursor.getCount()>0){
            if(contactsCursor.moveToFirst()){
                while (contactsCursor.moveToNext()) {

                    String hasPhoneNumber = contactsCursor.getString(contactsCursor
                            .getColumnIndexOrThrow(ContactsContract.Contacts.HAS_PHONE_NUMBER));
                    int contTypeInt=0;
                    String contactType="";
                    ArrayList<String> phoneNumberList= new ArrayList<String>();
                    if (Integer.parseInt(hasPhoneNumber) > 0) {

                        String id = contactsCursor.getString(contactsCursor
                                .getColumnIndexOrThrow(ContactsContract.Contacts._ID));

                        Cursor phones = getContentResolver().query(
                                ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,
                                ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + id, null, null);
                        String phoneNumber = null;
                        if(phones!=null && phones.getCount()>0){
                            while (phones.moveToNext()) {
                                int type= phones.getInt(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
                                if (type == Phone.TYPE_MOBILE){
                                    phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                                    phoneNumberList.add(phoneNumber);
                                }
                            }
                            contTypeInt++;
                            phones.close();
                            phones = null;
                        }
                    }

                    String id = contactsCursor.getString(contactsCursor
                            .getColumnIndexOrThrow(ContactsContract.Contacts._ID));
                    String name = contactsCursor.getString(contactsCursor
                            .getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
                    Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,null,
                            ContactsContract.CommonDataKinds.Email.CONTACT_ID+ " = " + id, null, null);
                    ArrayList<String> emailAddressList= new ArrayList<String>();
                    if(emails!=null && emails.getCount()>0){
                        while (emails.moveToNext()) 
                           {
                               // This would allow you get several email addresses
                               String emailAddress = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                               if(strEmails.equals("")){
                                   strEmails= emailAddress;
                               }else{
                                   strEmails= strEmails+","+emailAddress;
                               }
                               Log.v(name+"==>", emailAddress);
                               if ((!emailAddress.equalsIgnoreCase(""))&&(emailAddress.contains("@"))) 
                               {   
                                Log.d("email", emailAddress);
                                   emailAddressList.add(emailAddress);
                               }
                           }
                        emails.close();
                        emails = null;
                    }

                    if(emailAddressList.size()>0){
                        //primaryEmailList.add(emailAddressList.get(0));
                        contTypeInt++;
                    }
                    if(contTypeInt==0){
                        contactType="";
                    }else if(contTypeInt==2){
                        contactType= "both";
                    }else if(contTypeInt==1){
                        if(emailAddressList.size()>0){
                            contactType="email";
                        }else{
                            contactType="phone";
                        }
                    }
                    Log.d(name+" conatctType", contactType);
                    if(name==null){
                        name="";
                    }

                    String []tempArr= name.split(" ");
                    for(int i=0;i<tempArr.length;i++){
                        if(tempArr[i].length()>1){
                            tempArr[i]= tempArr[i].substring(0, 1).toUpperCase() + tempArr[i].substring(1);
                        }
                    }
                    String nameTmp="";
                    for(int i=0;i<tempArr.length;i++){
                        if(nameTmp.equals("")){
                            nameTmp= tempArr[i];
                        }else{
                            nameTmp= nameTmp+" "+tempArr[i];
                        }

                    }
                    Constants.contactsList.add(new ContactsData(id, nameTmp, contactType, phoneNumberList, emailAddressList));
                    phoneNumberList = null;
                    emailAddressList = null;
                    tempArr = null;
                }
            }
        }
        contactsCursor.close();
        contactsCursor = null;
        }
        catch (Exception e) {

        }

有没有人可以帮助我?提前致谢

4

2 回答 2

1

您应该使用Content Provider,而不是游标。内容提供程序是专门为避免这种游标问题而设计的。

这是一个例子

基本上,您应该一次查询这些数据。您一次查询一点。这可能会导致 SQLite 出现问题,您可能应该重新设计代码。

于 2013-09-04T17:54:31.790 回答
0

您的错误可能是由于没有检查加载您的联系人的 Fragment 是否已经创建。为此,您需要检查onCreate()在 Fragment 中传递给您的方法的 Bundle 是否为空。如果是第一次创建 Fragment,您应该只加载联系人。例子:

public void onCreate (Bundle savedInstanceState) {

    if(savedInstanceState == null) {
        // load the contacts
    }
}

请注意,在任何 Fragment 中执行此操作都很重要,因为每次布局从纵向更改为横向或反之亦然时,都会重新创建 Fragment。

于 2013-09-04T17:33:06.103 回答