Android:Führen Sie einen Thread im Hintergrund aus, ohne die Aktivität zu verzögern
-
21-12-2019 - |
Frage
Ich habe einen Prozess, der Kontaktinformationen abruft, und es dauert lange – 4 Sekunden.Ich möchte nicht, dass es das Benutzererlebnis in meiner App beeinträchtigt.Ich habe 2 Fragen:
- Wie kann ich dies in einem eigenen Thread ausführen, damit die Aktivität beim Zeichnen auf dem Bildschirm nicht verzögert wird?
- Gibt es eine Möglichkeit, dies zu beschleunigen?(Mache ich es ineffizient?)
Ich habe versucht, die unten stehende getContacts()-Methode über onCreate, onStart und onResume aufzurufen, aber in allen Fällen erscheint der Bildschirm erst, nachdem die Methode vollständig ausgeführt wurde.
Hier ist der Code:
private void getContacts() {
Thread thread = new Thread() {
@Override
public void run() {
try {
Log.d("ManageFriends","getContacts Start");
ContentResolver cr = getContentResolver();
String[] PROJECTION = new String[] {
ContactsContract.CommonDataKinds.Email.CONTACT_ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Email.ADDRESS,
ContactsContract.CommonDataKinds.Email.IS_PRIMARY,
};
String filter = ContactsContract.CommonDataKinds.Email.ADDRESS + " NOT LIKE '' AND 1 == " +
ContactsContract.Contacts.IN_VISIBLE_GROUP + " AND " +
ContactsContract.Contacts.DISPLAY_NAME + " NOT LIKE '%@%'";
Cursor cur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, PROJECTION, filter, null, null);
DBHelper.insertArrayList(db,"Contacts",DBHelper.cursorToArrayList(cur));
Log.d("ManageFriends","getContacts End");
}
catch (Exception e) {
e.printStackTrace();
}
}
};
thread.run();
}
Notiz:Mir ist der Hauptgrund dafür bewusst, dass dieser Prozess langsam ist: Ich konvertiere das Cursorergebnis in eine ArrayList <ArrayList <String>> und füge es dann in eine SQLite-Datenbank ein.Aber wenn ich es im Hintergrund zum Laufen bringen könnte, wäre ich glücklich.
Lösung
Erwägen Sie die Verwendung von a daemon
Faden.
Daemon
Threads werden normalerweise verwendet, um Dienste für Ihre Anwendung/Ihr Applet auszuführen (z. B. das Laden der „fiddley bits“).Der Hauptunterschied zwischen Benutzer-Threads und Daemon-Threads besteht darin, dass die JVM ein Programm erst dann herunterfährt, wenn alle Benutzer-Threads beendet wurden.Daemon-Threads werden von der JVM beendet, wenn keine Benutzer-Threads mehr ausgeführt werden, einschließlich des Haupt-Ausführungs-Threads.
P.S.Es handelt sich um einen Thread mit niedriger Priorität
Quellen:
Beispiel
Thread thread = new Thread();
thread.setDaemon(true);
thread.start();
BEARBEITEN!
Schau dir das an Verknüpfung für AsyncTask
Dies ist ein Thread für UI-Hintergrundaufgaben.
Andere Tipps
Überlegen Sie die Verwendung des Cursorloaders, der Daten von ContentProvider im Hintergrundthread lädt: AbrufenEine Liste der Kontakte