Android 对象无法访问,是否已被其他线程删除?

Android 对象无法访问,是否已被其他线程删除?,android,realm,Android,Realm,我有这个功能,当手机中的联系人发生任何变化时,就会调用它。现在的问题是,这个代码在HTC Desire 620(KitKat)上运行良好,但在Moto G(棒棒糖)和其他设备上崩溃 错误:java.lang.IllegalStateException:非法状态:对象不再有效,无法对其进行操作。它被删除了吗? 另外:如果触点不太像0) { final int nameIndex=phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone

我有这个功能,当手机中的联系人发生任何变化时,就会调用它。现在的问题是,这个代码在HTC Desire 620(KitKat)上运行良好,但在Moto G(棒棒糖)和其他设备上崩溃

错误:java.lang.IllegalStateException:非法状态:对象不再有效,无法对其进行操作。它被删除了吗?

另外:如果触点不太像<500的话,它可以与Moto G2配合使用,但是如果触点太多,它就会崩溃

Logcat详细信息:

  • E/AndroidRuntime:Process:com.advisualinc.echo:SwitchService,PID:16972
  • E/AndroidRuntime:java.lang.IllegalStateException:非法状态:对象不再有效,无法对其进行操作。它被另一个线程删除了吗
  • E/AndroidRuntime:at io.realm.internal.uncheckdrow.nativeGetString(本机方法)
  • E/AndroidRuntime:at java.lang.Thread.run(Thread.java:818)
  • 我的服务级别:

    public class ContactsSyncService extends Service {
        public static int count = 0;
        int k = 0;
    
        Realm realmFresh;
        public static boolean contactUpdated = false;
        ContentObserver mObserver;
        public  Context contextService = ContactsSyncService.this;
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
             mObserver = new ContentObserver(new Handler()) {
                @Override
                public void onChange(boolean selfChange) {
                    super.onChange(selfChange);
                    k++;
                 //   Toast.makeText(ApplicationController.getInstance(), "Starting Change: " , Toast.LENGTH_SHORT).show();
                    if (!contactUpdated) {
                        contactUpdated = true;
                        Logger.debug("Contact Update to start -->");
                      //  Toast.makeText(ApplicationController.getInstance(), "Changing: " , Toast.LENGTH_SHORT).show();
                        FetchLocalContacts.refreshingContactsDB(contextService);
                      //  Toast.makeText(ApplicationController.getInstance(), "Changed:  " , Toast.LENGTH_SHORT).show();
                    }
                }
            };
            getContentResolver().registerContentObserver(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, true, mObserver);
            return START_STICKY;
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            getContentResolver().unregisterContentObserver(mObserver);
        }
    }
    
    服务调用的函数是刷新ContactsDB():

    public static void parseContactstoContactsDB()
    {
    
        Thread background = new Thread(new Runnable()
        {
            public void run()
            {
                Realm realmFetchFirstTime = Realm.getInstance(ApplicationController.getInstance());
    
                ContentResolver cr = ApplicationController.getInstance()
                        .getContentResolver();
    
    
                Cursor phones = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, PROJECTION,null,null, null);
    
                String duplicateName = "";
                String duplicatePhone = "";
    
                if( phones.getCount() >0)
                {
    
                    final int nameIndex = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
                    final int numberIndex = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
    
                    while (phones.moveToNext())
                    {
    
                        String name = phones.getString(nameIndex);
                        String phoneNo = phones.getString(numberIndex);
    
    
    
                        if(phoneNo!=null&&!phoneNo.isEmpty())
                        {
    
                            phoneNo = phoneNo.replace(" ", "");
                            phoneNo = phoneNo.replace("(", "");
                            phoneNo = phoneNo.replace(")", "");
                            phoneNo = phoneNo.replace("-", "");
                            phoneNo = phoneNo.replace("\u00a0", "");
                            phoneNo = phoneNo.replace("\u202c", "");
                            phoneNo = phoneNo.replace("\u2011", "");
                            phoneNo = phoneNo.replace("\u202a", "");
                            phoneNo = phoneNo.replace("*", "");
                            phoneNo = phoneNo.replace("#", "");
    
                            if (phoneNo.length() >= 5)
                            {
    
                                if(name.equalsIgnoreCase(duplicateName)&&phoneNo.equalsIgnoreCase(duplicatePhone))
                                {
                                    continue;
                                }
    
                                duplicateName = name;
                                duplicatePhone = phoneNo;
    
                                String formattedPhoneNumber;
                                formattedPhoneNumber = parseNumber(phoneNo);
    
                                realmFetchFirstTime.beginTransaction();
                                R_LocalContactDB rContacts = realmFetchFirstTime.createObject(R_LocalContactDB.class);
                                rContacts.setName(name);
                                rContacts.setPhone(formattedPhoneNumber);
                                realmFetchFirstTime.commitTransaction();
    
    
                                Logger.debug("Formatted Contacts -->  Name: "
                                        + name
                                        + " --  Phone No: "
                                        + formattedPhoneNumber);
                            }
    
                        }
    
                    }
                    phones.close();
    
                }
    
                realmFetchFirstTime.close();
                // getNumbersFromDBAndUpdate();
            }
        });
        background.start();
    
    }
    
    
    
    public static void getNumbersFromDBAndUpdate()
    {
    
        Realm realmServer = Realm.getInstance(ApplicationController.getInstance());
        RealmResults<R_LocalContactDB> query = realmServer.where(R_LocalContactDB.class).findAll();
        Logger.debug("Contact Update updating to server -->");
    
        for (int i = 0; i < query.size(); i++)
        {
            phoneNumberJsonArray.put(query.get(i).getPhone());
        }
    
        try
        {
            uploadContactJsonBody.put("phone_numbers", phoneNumberJsonArray);
    
            Logger.debug("LocalContacts RequestJson ---> "
                    + uploadContactJsonBody.toString());
            AppPreferenceManager.getInstance().setContactPref(1);
    
            UploadLocalContactsToServerAsynTask test = new UploadLocalContactsToServerAsynTask(
                    uploadContactJsonBody.toString(),
                    new LocalContactsSyncCallBack()
                    {
    
                        @Override
                        public void didFinishProfileSync(boolean bool,
                                                         String result) {
    
    
                            Logger.debug("Is ContactUpdated FetchContacts --> "
                                    + bool);
    
                            setMatchedStatusToFalse();
    
                            AppPreferenceManager.getInstance().setContactUpdate(bool);
                            Intent roomIntent = new Intent();
                            roomIntent
                                    .setAction("com.advisualinc.echo.fetch.local_contacts");
                            ApplicationController.getInstance().sendBroadcast(roomIntent);
                        }
                    });
    
            test.execute();
        }
        catch (JSONException e)
        {
            e.printStackTrace();
        }
        realmServer.close();
    
    }
    
    
    
    public static void refreshingContactsDB()
    {
        Thread background = new Thread(new Runnable()
        {
            public void run()
            {
    
                realmFresh = Realm.getInstance(ApplicationController.getInstance());
    
                createCountryDetailsArrayModel();
                R_LocalContactDB rCont;
                TelephonyManager tm = (TelephonyManager) ApplicationController.getInstance()
                        .getSystemService(Context.TELEPHONY_SERVICE);
                String simCountryISO = tm.getSimCountryIso();
    
                for (int i = 0; i < countryDetailsList.size(); i++)
                {
                    if (simCountryISO.equalsIgnoreCase(countryDetailsList.get(i)
                            .getCode()))
                    {
    
                        dialCodePrefix = countryDetailsList.get(i).getDial_code();
    
                    }
                }
    
    
                AppPreferenceManager.getInstance().setContactUpdate(false);
    
                Logger.debug("Contact Update Refreshing Contact Started -->");
    
    
                ContentResolver cr = ApplicationController.getInstance()
                        .getContentResolver();
    
                Cursor phones = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, PROJECTION, null, null, null);
    
                String duplicateName = "";
                String duplicatePhone = "";
    
                if (phones.getCount() > 0)
                {
    
                    final int nameIndex = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
                    final int numberIndex = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
    
                    while (phones.moveToNext())
                    {
                        String name = phones.getString(nameIndex);
                        String phoneNo = phones.getString(numberIndex);
    
                        if (phoneNo != null && !phoneNo.isEmpty())
                        {
    
                            phoneNo = phoneNo.replace(" ", "");
                            phoneNo = phoneNo.replace("(", "");
                            phoneNo = phoneNo.replace(")", "");
                            phoneNo = phoneNo.replace("-", "");
                            phoneNo = phoneNo.replace("\u00a0", "");
                            phoneNo = phoneNo.replace("\u202c", "");
                            phoneNo = phoneNo.replace("\u2011", "");
                            phoneNo = phoneNo.replace("\u202a", "");
                            phoneNo = phoneNo.replace("*", "");
                            phoneNo = phoneNo.replace("#", "");
    
                            if (phoneNo.length() >= 5)
                            {
                                if (name.equalsIgnoreCase(duplicateName) && phoneNo.equalsIgnoreCase(duplicatePhone)) {
                                    continue;
                                }
    
                                duplicateName = name;
                                duplicatePhone = phoneNo;
    
                                String formattedPhoneNumber;
                                formattedPhoneNumber = parseNumber(phoneNo);
    
                                R_LocalContactDB realmResults = realmFresh.where(R_LocalContactDB.class).equalTo("phone", formattedPhoneNumber).findFirst();
    
                                Logger.debug("Size: " + realmResults);
                                R_LocalContactDB rContacts = new R_LocalContactDB(null, null, false, 0);
    
    
                                if (realmResults == null)
                                {
                                    i++;
                                    realmFresh.beginTransaction();
                                    rCont = realmFresh.copyToRealm(rContacts);
                                    rCont.setName(name);
                                    rCont.setPhone(formattedPhoneNumber);
                                    rCont.setStatus(0);
                                    rCont.setMatchedWithRecent(true);
                                    //   Logger.debug("New Size: " + query.size());
                                    realmFresh.commitTransaction();
                                }
    
                                else if( realmResults.isValid())
                                {
    
                                    realmFresh.beginTransaction();
                                    if (!name.equalsIgnoreCase(realmResults.getName()))
                                    {
                                        realmResults.setName(name);
                                    }
    
                                    realmResults.setMatchedWithRecent(true);
    
                                    // Logger.debug("New Size Else Condition: " + query.size());
                                    realmFresh.commitTransaction();
    
    
    
                                }
    
    
    
                            }
    
    
                        }
    
                    }
                    ContactsSyncService.contactUpdated = false;
    
    
    
    
    
                }
                realmFresh.close();
                deleteExtraContacts();
                getNumbersFromDBAndUpdate();
            }
        });
        background.start();
    
    }
    
    public static void parseContactstoContactsDB()
    {
    线程背景=新线程(newrunnable()
    {
    公开募捐
    {
    realmrealmfetchfirsttime=Realm.getInstance(ApplicationController.getInstance());
    ContentResolver cr=ApplicationController.getInstance()
    .getContentResolver();
    游标phones=cr.query(ContactsContract.CommonDataTypes.Phone.CONTENT\u URI,投影,null,null,null);
    字符串重复名称=”;
    字符串duplicationphone=“”;
    如果(phones.getCount()>0)
    {
    final int nameIndex=phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY\u NAME);
    final int numberIndex=phones.getColumnIndex(contacts contract.commonDataTypes.Phone.NUMBER);
    while(phones.moveToNext())
    {
    字符串名称=phones.getString(nameIndex);
    String phoneNo=phones.getString(numberIndex);
    if(phoneNo!=null&&!phoneNo.isEmpty())
    {
    phoneNo=phoneNo.replace(“,”);
    phoneNo=phoneNo.replace(“(”,”);
    phoneNo=phoneNo.replace(“),”);
    phoneNo=phoneNo.replace(“-”,”);
    phoneNo=phoneNo.replace(“\u00a0”,”);
    phoneNo=phoneNo.replace(“\u202c”,”);
    phoneNo=phoneNo.replace(“\u2011”,”);
    phoneNo=phoneNo.replace(“\u202a”,”);
    phoneNo=phoneNo.replace(“*”,”);
    phoneNo=phoneNo.replace(“#”,”);
    如果(phoneNo.length()>=5)
    {
    if(name.equalsIgnoreCase(duplicateName)&&phone否.equalsIgnoreCase(duplicatePhone))
    {
    继续;
    }
    重复名称=名称;
    duplicatePhone=电话号码;
    字符串格式化的电话号码;
    formattedPhoneNumber=parseNumber(phoneNo);
    realmFetchFirstTime.beginTransaction();
    R_LocalContactDB rContacts=realmFetchFirstTime.createObject(R_LocalContactDB.class);
    rContacts.setName(名称);
    rContacts.setPhone(格式化电话号码);
    realmFetchFirstTime.commitTransaction();
    Logger.debug(“格式化联系人-->名称:”
    +名字
    +“--电话号码:”
    +格式化电话号码);
    }
    }
    }
    电话。关闭();
    }
    realmFetchFirstTime.close();
    //getNumbersFromDBAndUpdate();
    }
    });
    background.start();
    }
    public static void getNumbersFromDBAndUpdate()
    {
    Realm realmServer=Realm.getInstance(ApplicationController.getInstance());
    RealmResults query=realmServer.where(R_LocalContactDB.class).findAll();
    debug(“联系更新到服务器-->”;
    for(int i=0;i”
    +上载ContactJSonBody.toString());
    AppPreferenceManager.getInstance().setContactPref(1);
    UploadLocalContactsToServerAsynTask测试=新的UploadLocalContactsToServerAsynTask(
    uploadContactJsonBody.toString(),
    新的LocalContactsSyncCallBack()
    {
    @凌驾
    public void didFinishProfileSync(布尔布尔布尔值,
    字符串结果){
    debug(“是否更新了联系人获取联系人-->”
    +布尔);
    setMatchedStatusToFalse();
    AppPreferenceManager.getInstance().setContactUpdate(bool);
    Intent roomIntent=新Intent();
    房间意向
    .setAction(“com.advisualinc.echo.fetch.local_contacts”);
    ApplicationController.getInstance().sendBroadcast(roomIntent);
    }
    });
    test.execute();
    }
    捕获(JSONException e)
    {
    e、 printStackTrace();
    }
    realmServer.close();
    }
    公共静态无效刷新联系人SDB()
    {
    线程背景=新线程(newrunnable()
    {
    公开募捐
    {