Utilizar LoaderCallback sin Fragmento

Estoy haciendo algunas prácticas de lectura en AsyncTaskLoader para que pueda utilizar la técnica para cargar la lista de contactos. La única vez que funciona el código es cuando implemento las devoluciones de llamada de una clase que se extiende Fragment como en MyLoader extends Fragment implements LoaderCallbacks<ArrayList<Contact>> . ¿Hay otra manera? Todo lo que realmente necesito es la lista de contactos (nombre, teléfono, miniatura), para enviar a mi backend. Cuando, por ejemplo, trato de usar Context , ya que puedo obtener que de cualquier actividad simplemente haciendo (Context)this , el código no puede incluso compilar. Por contexto quiero decir

 context.getLoaderManager().initLoader(1, null, this); //I already changed to Fragment so don't really remember the exact ".context" line. //But someone who has done this will understand the snippet. 

BTW: Estoy usando referencias múltiples. Uno es http://developer.android.com/reference/android/content/AsyncTaskLoader.html .

PREGUNTA (de nuevo): ¿Puedo utilizar AsyncTaskLoader sin Fragment o FragmentActivity?

EL CÓDIGO QUE TRABAJA CON EL FRAGMENTO:

 package com.example.contactpreload.utils; import java.util.ArrayList; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.Loader; public class LoadingContacts extends Fragment implements LoaderCallbacks<ArrayList<Contact>> { ArrayList<Contact> loadedContacts; static Fragment fragmentActivity; public static LoadingContacts newInstance(int arg) { LoadingContacts f = new LoadingContacts(); Bundle bundle = new Bundle(); bundle.putInt("index", arg); f.setArguments(bundle); fragmentActivity = new Fragment(); return f; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); System.out.println("onCreate()"); int mIndex = getArguments().getInt("index"); System.out.println(mIndex); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); System.out.println("onActivityCreated()"); getLoaderManager().initLoader(1, null, this); } @Override public Loader<ArrayList<Contact>> onCreateLoader(int arg0, Bundle arg1) { System.out.println("onCreateLoader()"); return new ContactsLoader(getActivity()); } @Override public void onLoadFinished(Loader<ArrayList<Contact>> loader, ArrayList<Contact> data) { loadedContacts = data; System.out.println("AND THE CONTACTS ARE: "); for (Contact c : loadedContacts) { System.out.println("NAME: " + c.getName()); System.out.println("getPhoneNumberHome: " + c.getPhoneNumber()); } } @Override public void onLoaderReset(Loader<ArrayList<Contact>> arg0) { System.out.println("onLoaderReset()"); // TODO Auto-generated method stub } } package com.example.contactpreload; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.view.Menu; import com.example.contactpreload.utils.LoadingContacts; public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LoadingContacts fragment = LoadingContacts.newInstance(1); fragment.setRetainInstance(true); getSupportFragmentManager().beginTransaction() .add(android.R.id.content, fragment).commit(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } 

MANIFIESTO:

 <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16" /> 

AsyncTaskLoader no tiene nada que ver con si está utilizando un Fragment o una Activity .

Para dar un ejemplo, considere una actividad de lista:

 public class ExampleActivity extends ListActivity implements LoaderManager.LoaderCallbacks<Cursor> { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.todo_list); //to start the loader: getLoaderManager().initLoader(0, null, this); } //override the loader callback methods as usual // Creates a new loader after the initLoader () call @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { CursorLoader cursorLoader = new CursorLoader(this, uri, projection, null, null, null); return cursorLoader; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { adapter.swapCursor(data); } @Override public void onLoaderReset(Loader<Cursor> loader) { // data is not available anymore, delete reference adapter.swapCursor(null); } } 

Obviamente, necesitas crear el adaptador correspondiente para la vista de lista y el diseño, pero el ejemplo te muestra cómo un simple cargador de cursor funcionaría para una Actividad.

Además, asegúrese de que todas las importaciones sean consistentes, ya sea utilizando la biblioteca support.v4 o la biblioteca regular:

 import android.app.LoaderManager; import android.content.CursorLoader; import android.content.Loader; 

Otra pregunta que se hace, es que si la interfaz LoaderCallback se puede utilizar de forma independiente. Esto no se recomienda si considera que LoaderCallback es para.

La LoaderManager.LoaderCallbacks<D> es un contrato simple que LoaderManager utiliza para informar los datos al cliente. Lo que esto significa, es su único trabajo es cargar algunos datos en el fondo solicitado por un cliente, que es efectivamente, una actividad.

Si crea una clase autónoma, podría extender la definición de clase para implementar LoaderManager.LoaderCallbacks<D> , pero deberá informar los datos cargados a la actividad original mediante algún tipo de mecanismo, lo que complicaría una tarea sencilla.

Ahora, si realmente está dispuesto a hacer esto, podría crear su clase autónoma de la siguiente manera:

 public class LoadingContacts implements LoaderManager.LoaderCallbacks<Cursor> { @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { return null; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { } @Override public void onLoaderReset(Loader<Cursor> loader) { } } 

En su método onLoadFinished , deberá enviar el Cursor cargado a través de una transmisión o de algún tipo de bus de mensaje:

  • LocalBroadcastManager
  • Otón
  • Messenger

Después de enviar esta información a MainActivity , puede cargarla en el adaptador y continuar tal cual.

  • Prueba de AsyncTaskLoaders con Robolectric
  • Actualizar la interfaz de usuario desde un AsyncTaskLoader
  • Cómo saber si AsyncTaskLoader se está ejecutando
  • AsyncTaskLoader no se ejecuta
  • ¿Qué hace realmente AsyncTaskLoader.deliverResult ()?
  • Cómo manejar los errores en AsyncTaskLoader personalizado?
  • Explique AsyncTaskLoader
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.