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:

  1. Wie kann ich dies in einem eigenen Thread ausführen, damit die Aktivität beim Zeichnen auf dem Bildschirm nicht verzögert wird?
  2. 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.

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top