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