In meiner App versuche ich alle Kontakte im lokalen Geschäft beim Öffnen zu speichern. Mein Code funktioniert hervorragend, wenn nicht zu viele Kontakte verfügbar sind. Wenn es jedoch mehr als 100 Kontakte gibt, dauert es ewig, sie alle zu speichern. Ich benutze Realm - ein DB-Framework, um jeden Kontakt in ein Modellobjekt umzuwandeln. Dies ist die Asynchron-Aufgabe, die ausgeführt wird, wenn mein app öffnet erstenDas Laden von Kontakten und das Speichern in Realm dauert sehr lange
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();
}
}
Und hier ist mein Kontakt Reich-Objekt:
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;
}
}
Es ist wichtig zu beachten, dass ich nur zu retten versuchen MOBILE-Nummern. Gibt es eine Möglichkeit, diesen Code zu optimieren? Oder gibt es andere Ansätze, um diese Informationen effizienter abzurufen? Venmo scheint das nahtlos zu schaffen.
Wenn ich versuche, diese Objekte im Hintergrund zu speichern, erhalte ich den folgenden Fehler: Realm-Zugriff von falschem Thread. Auf Realm-Objekte kann nur in dem Thread zugegriffen werden, in dem sie erstellt wurden. –
Gibt 'RoofActivity.getRealmInstance()' eine zwischengespeicherte Instanz zurück? Sie müssen eine Realm-Instanz für den aktuellen Thread in der Hintergrundaufgabe abrufen (und dann 'close()' am Ende der Aufgabe aufrufen). –
Ja, du hast Recht. Realm.getDefaultInstance(), anstatt eine Instanz in der Aktivität zu speichern, löste alle meine Probleme! Der Kontaktabruf ist jetzt etwas schneller, aber immer noch nicht ideal. Irgendwelche Ideen, wie ich das beschleunigen kann? –