Puedo usar el método get () de AsnycTask para esperar a que se complete la tarea en segundo plano, pero ¿cómo lo hago si estoy usando CursorLoader y ContentProvider con LoaderManager Callback?

¿También es posible evitar que el subproceso de la interfaz de usuario espere los datos devueltos en el subproceso en segundo plano?

3
zbryan 31 dic. 2016 a las 14:41
1
La idea general de un cargador es que no hace que el hilo de la interfaz de usuario espere, muestre una pantalla vacía, datos ficticios o una ruleta de carga hasta que obtenga datos
 – 
Blundell
31 dic. 2016 a las 15:04
Sí, de lo contrario, si desea utilizar el solucionador de contenido, debe envolver el proceso en una AsyncTask.
 – 
AouledIssa
31 dic. 2016 a las 15:12

4 respuestas

Puede pasar fácilmente su interfaz para obtener la devolución de llamada de Asynctask. Esta es la forma correcta de obtener una solución a su problema

0
SANJAY GUPTA 31 dic. 2016 a las 14:50
La idea completa de AsyncTask es proporcionar una entrada / salida del hilo principal. No sé por qué usaría una interfaz de devolución de llamada.
 – 
AouledIssa
31 dic. 2016 a las 15:14

Muestre ProgressDialog para esperar hasta que no se reciba la respuesta. si su respuesta se recibe de la misma clase o actividad, entonces no use la devolución de llamada de la interfaz, si la respuesta se recibe de otra actividad de la clase, entonces use la devolución de llamada de la interfaz

0
Mubashar Javed 31 dic. 2016 a las 15:03

No se recomienda esperar en UIThread, ya que hace que la aplicación parezca retrasada o bloqueada. blundell hizo un buen punto en la edición.

0
Kiva John 31 dic. 2016 a las 15:08

Tengo exactamente la misma situación en uno de mis proyectos actuales donde tengo que solicitar la lista de contactos usando el proveedor de contenido y los cargadores de cursor para mostrarlos más tarde en una vista de lista.

Entonces, esto es lo que debe hacer:

  • Realice una llamada asíncrona al proveedor de contenido desde dentro de su actividad / fragmento utilizando la tarea asíncrona como una clase interna estática.
  • Dentro del método AsyncTask doInBackground() colocas tu función para recuperar el cursor y procesar tus datos allí, de modo que terminas devolviendo un List<Object> El objeto es el modelo devuelto (contacto) en mi caso.
  • Dentro del método onPostExecute() de AsyncTask, simplemente pasa la lista de datos recuperados a cualquier Vista con la que esté trabajando (nuevamente en mi caso es un List<Contact> y allí donde su mainThread está recibiendo datos y solo allí tiene que procesar los datos cuando estén listos.

AsyncTask hace su vida mucho más fácil, ya que tienen una estructura de cadena para manejar el paso de datos de un MainThread a un Thread separado en segundo plano y luego enviar los datos del Thread en segundo plano al MainThread.

En términos de código, su código debería verse así:

public class MainActivity extends Activity {
    private AsyncTask mTask;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //
        ...... 
        //Call the AsyncTask and pass your Data
        mTask = new Task(this);
        mTask.execute();
    }

    private static class Task extends AsyncTask<Void, Void, List<Object> {
        private WeakReference<Contex> mContextRef;
        public Task(Context context) {
            mContextRef = new WeakReference<>(context);
            //later when you need your context just use the 'get()' method. like : mContextRef.get() (this will return a Context Object.
        }

        @Override
        protected void onPreExecute() {
            // show progress Dialog
           //this method is processed in the MainThread, though it can prepare data from the background thread.
        }

        @Override
        protected List<Object> doInBackground(Void ... params) {
            List<Object> mList = new ArrayList<>();
            //Call your content provider here and gather the cursor and process your data..
           //return the list of object your want to show on the MainThread.
           return mList;
        }

        @Override
        protected Void onPostExecute(List<Object> list) {
            if(list.size() > 0) {
            //do your stuff : i.e populate a listView
            }
        }
    }
}
0
AouledIssa 31 dic. 2016 a las 15:12