加载联系人并保存到领域需要很长时间

时间:2016-06-06 18:41:04

标签: android optimization android-asynctask realm contacts

在我的应用中,我试图在打开时保存本地商店中的所有联系人。当没有太多的联系人可以访问时,我的代码很有用。但是,当有100多个联系人时,需要永远保存它们。我正在使用Realm--一个DB框架,将每个联系人变成一个模型对象。这是我的应用首次打开时运行的异步任务

private class AppOpeningAsyncTask extends AsyncTask<Void,Void,Void> {

    // Operations performed in the background.
    @Override
    protected Void doInBackground(Void... params) {

        // Retrieving and saving users contacts
        Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
        while (phones.moveToNext())
        {
            String name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            Contact.createOrUpdateWithNameAndNumber(name, phoneNumber, (RoofActivity) mContext);
        }
        phones.close();

        return null;
    }

    // Operations performed on UI thread.
    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);

        enterApp();

    }
}

这是我的Contact realm对象:

public class Contact extends RealmObject {

private String name;

@PrimaryKey
private String number;

public static void createOrUpdateWithNameAndNumber(final String name, final String number, final RoofActivity activity){

    ((Activity)activity).runOnUiThread(new Runnable() {
        @Override
        public void run() {

            Realm realm = activity.getRealmInstance();
            Contact contact = realm
                    .where(Contact.class)
                    .equalTo("name", name)
                    .equalTo("number", number)
                    .findFirst();

            if (contact == null) {
                contact = new Contact();
            }

            realm.beginTransaction();

            contact.setName(name);
            contact.setNumber(number);

            realm.copyToRealmOrUpdate(contact);
            realm.commitTransaction();
        }
    });
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getNumber() {
    return number;
}

public void setNumber(String number) {
    this.number = number;
}

}

值得注意的是,我只想保存MOBILE号码。有什么办法可以优化这段代码吗?或者是否有任何其他方法可以更有效地检索此信息。 Venmo似乎无缝地实现了这一目标。

1 个答案:

答案 0 :(得分:1)

您应该为所有更新使用单个写入事务,而不是每次插入一个,并且不应该将更新分派给UI线程。

Realm有一些每个事务的开销,当你每个事务只插入一个对象时,这个开销将大大超过实际插入该对象所花费的时间。在单个事务中插入100个对象可能比两个只插入单个对象的事务花费更少的时间。

将更新分派给UI线程与您想要做的完全相反;您应该尝试避免在UI线程上执行写入事务,而不是在没有理由的情况下这样做。