Pregunta

Tengo un proceso que extrae la información de contacto, y lleva mucho tiempo, 4 segundos.No quiero que interfiera con la experiencia del usuario en mi aplicación.Tengo 2 preguntas:

  1. ¿Cómo puedo ejecutar esto en su propio hilo, por lo que no demora la actividad de dibujar en la pantalla
  2. ¿Hay alguna manera de acelerar esto?(¿Lo estoy haciendo ineficientemente?)
  3. He intentado llamar al método GetContacts () a continuación de OnCreate, desde OnSart, desde OnSart, y OnResume, pero en todos los casos, la pantalla no aparece hasta que se haya ejecutado completamente el método.

    Aquí está el código:

    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();
    }
    

    Nota: Soy consciente de la gran razón por la que este proceso es lento: estoy convirtiendo el resultado del cursor con una lista de array > y luego insertándolo en un DB SQLite.Pero si pudiera hacerlo trabajar en el fondo, sería feliz.

¿Fue útil?

Solución

Considere usar un hilo de daemon.

Los hilos Daemon se utilizan normalmente para realizar servicios para su aplicación / applet (como cargar los "Bits Fiddley"). La diferencia central entre las roscas de los usuarios y las roscas de los demonios es que el JVM solo apagará un programa cuando todos los hilos de usuario hayan terminado. Los hilos de los demonios se terminan por el JVM cuando ya no hay ninguna conexión de los hilos de usuario, incluido el hilo principal de ejecución.

P.s. Es un hilo de baja prioridad

Fuentes:

Ejemplo

Thread thread = new Thread();

thread.setDaemon(true);

thread.start();

editar!

Echa un vistazo a este enlace para AsyncTask, que es un hilo para ui Tareas de fondo.

Otros consejos

Considere el uso de CursorLoader que carga los datos de ContentProvider en el hilo de fondo: recuperandouna lista de contactos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top