加载联系人并保存到领域需要很长时间
Loading contacts and saving to realm taking a very long time
在我的应用程序中,我试图在打开时将所有联系人保存在本地商店中。当没有太多联系人可供访问时,我的代码效果很好。但是,当有 100 多个联系人时,需要很长时间才能将它们全部保存下来。我正在使用 Realm——一个数据库框架,将每个联系人变成一个模型对象。这是我的应用首次打开时运行的异步任务
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();
}
}
这是我的联系人领域对象:
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;
}
}
请务必注意,我只是想保存手机号码。有什么办法可以优化这段代码吗?或者是否有任何其他方法可以更有效地检索此信息。 Venmo 似乎可以无缝地完成此任务。
您应该对所有更新使用单个写入事务,而不是每次插入一个事务,并且您不应该将更新分派到 UI 线程。
Realm 有一些每个事务的开销,当你在每个事务中只插入一个对象时,这个开销将远远大于实际插入该对象所花费的时间。在单个事务中插入 100 个对象可能比两个事务只插入一个对象花费的时间更少。
将您的更新分派到 UI 线程与您想要做的完全相反;您应该尝试 避免 在 UI 线程上执行写入事务,不要在没有理由的情况下特意这样做。
在我的应用程序中,我试图在打开时将所有联系人保存在本地商店中。当没有太多联系人可供访问时,我的代码效果很好。但是,当有 100 多个联系人时,需要很长时间才能将它们全部保存下来。我正在使用 Realm——一个数据库框架,将每个联系人变成一个模型对象。这是我的应用首次打开时运行的异步任务
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();
}
}
这是我的联系人领域对象:
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;
}
}
请务必注意,我只是想保存手机号码。有什么办法可以优化这段代码吗?或者是否有任何其他方法可以更有效地检索此信息。 Venmo 似乎可以无缝地完成此任务。
您应该对所有更新使用单个写入事务,而不是每次插入一个事务,并且您不应该将更新分派到 UI 线程。
Realm 有一些每个事务的开销,当你在每个事务中只插入一个对象时,这个开销将远远大于实际插入该对象所花费的时间。在单个事务中插入 100 个对象可能比两个事务只插入一个对象花费的时间更少。
将您的更新分派到 UI 线程与您想要做的完全相反;您应该尝试 避免 在 UI 线程上执行写入事务,不要在没有理由的情况下特意这样做。