Realm对象在android中失效

时间:2016-07-04 19:29:25

标签: android android-asynctask realm

我有一个联系人(模型)列表。该列表是领域对象列表。我从领域得到那些对象,如

    public static List<Contact> getAllTazligenContacts(Context context) {
    Realm realm = Realm.getInstance(context);
    return realm.where(Contact.class)
            .equalTo("isTazligenContact", true)
            .findAll();
    }

现在的问题是我正在调用asynctask并且我在该类中使用此列表。我花了一个小时才发现问题出在我的realmObjects上,因为在我的asynctask

public class AsyncCallContacts extends AsyncTask<String, Void, List<Contact>> {

private ProgressDialog dialog = new ProgressDialog(mContext);
@Override
protected void onPreExecute() {
    dialog = ProgressDialog.show(mContext, null, getString(R.string.getting_contacts));
    super.onPreExecute();
}

@Override
protected List<Contact> doInBackground(String... params) {
  //Some task (realm objectList is used)
}

@Override
protected void onPostExecute(List<Contact> result) {
    super.onPostExecute(result);
    dialog.setMessage(getString(R.string.finishing_up));       
}
}

问题是我调试了应用程序,当我在onPreExecute时列表似乎很好但是当我进入onBackground时我的列表被无效,即在每个索引上它都显示“非法状态异常或无效对象”。 我做了一些搜索,发现可能是线程删除或使对象无效。所以我的问题是如何解决这个问题。如何防止我的领域列表失效?感谢

1 个答案:

答案 0 :(得分:4)

Realm,RealmResult&amp; RealmObject不能跨线程传递,当您在AsyncTask中使用RealmObjects时,您将它们移动到其他线程,这就是您获得无效对象的原因。

您可以使用以下任何解决方案,

  • 将所有操作保留在同一个线程
  • 在后台线程中获取RealmObjects
  • 将RealmObjects复制到非Realm模型类并将其用于您的操作