2011-05-19 34 views
6

Estoy empezando a jugar con el nuevo cursorLoader y estoy teniendo problemas. El siguiente código es sólo para entender cómo funciona el cursorLoader pero aparece:Android CursorLoader

"Tratar de volver a consultar y el cursor ya cerrado", cuando reanudo esta actividad. La aplicación funcionaba bien antes de comenzar a jugar con el cursorLoader. ¿Algunas ideas?

private Cursor getSectionData(CharSequence parent_id) { 

    String[] projection = new String[] {Titles.SECTION, Titles.TITLE, Titles._ID, Titles.CODE_RANGE,}; 
    Uri titles = Titles.CONTENT_URI; 
    String select = "" + Titles.PARENT_ID + " match " + parent_id + ""; 
    CursorLoader loader = new CursorLoader(this, titles, projection, select, null, null); 
    Cursor cTitles = loader.loadInBackground(); 


    String[] projection1 = new String[] {Codes.CODE, Codes.EXCERPT, Codes._ID,}; 
    Uri codes = Codes.CONTENT_URI; 
    String select1 = "" + Codes.PARENT_ID + " match " + parent_id + ""; 
    CursorLoader loader1 = new CursorLoader(this, codes, projection1, select1, null, null); 
    Cursor cCodes = loader1.loadInBackground(); 



    //Cursor cTitles = db.rawQuery("select section, title, _id, code_range from titles where parent_id match " + parent_id + "", null); 
    //startManagingCursor(cTitles); 
    //Cursor cCodes = db.rawQuery("select code, excerpt, _id from codes where parent_id match " + parent_id + "", null); 

    mQuery = "select code, excerpt, _id from codes where parent_id match " + parent_id + ""; 

    //startManagingCursor(cCodes); 
    Cursor[] c = {cTitles, cCodes}; 
    Cursor cursor = new MergeCursor(c); 
    startManagingCursor(cursor); 

    return cursor; 

} 

Respuesta

12

que no creen que la captura de la posición del cursor en loader.loadInBackground() es lo que quiere. La implementación de loadInBackground() básicamente hace una consulta y le devuelve el cursor en el hilo de la interfaz de usuario, que es lo que trata de evitar.

ser en cualquier momento cautelosa que están esperando en el subproceso de interfaz de usuario para un valor de retorno. Debería ser un buen indicador de que esto no es algo que desee.

Lo que hice para solucionar este problema era que reiniciar el cargador. En mi caso, estoy tratando de usar la barra de acciones para buscar mi contenido. Mi clase extiende ListFragment e implementa LoaderManager.LoaderCallbacks la actividad que alberga este implementa OnQueryTextListener y está llamando en el fragmento aquí está el código que estoy haciendo en el fragmento.

public void doSearch(String query) { 
    Bundle bundle = new Bundle(); 
    bundle.putString("query", query); 

    getLoaderManager().restartLoader(LoaderMangerIdHelper.INVENTORY, bundle, this); 
} 

Tenga en cuenta que debe reiniciar el cargador. Todos los cargadores son administrados por el sistema. Esto hará que se vuelva a llamar a tu onCreateLoader. Por lo tanto, deberá verificar la cadena de consulta para establecer su selección.

@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle bundle) { 
    String SELECTION = "someColumn=?"; 
    List<String> selectionArgs = new ArrayList<String>(); 
    selectionArgs.add("someArgs"); 

    if (bundle != null && bundle.containsKey("query")) { 
     SELECTION += " AND columnTitle LIKE ?"; 
     selectionArgs.add(bundle.getString("query") + "%"); 
    } 

    final String[] SELECTION_ARGS = new String[selectionArgs.size()]; 
    selectionArgs.toArray(SELECTION_ARGS); 

    mLoader = new CursorLoader(getActivity(), RoamPay.Product.CONTENT_URI, null, SELECTION, 
      SELECTION_ARGS, null); 

    return mLoader; 
} 

Esto inicia el cursorLoading en el fondo. Y las devoluciones de llamada deberían ser las mismas que de costumbre.

@Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
     // Swap the new cursor in. (The framework will take care of closing the 
     // old cursor once we return.) 
     mAdapter.swapCursor(data); 

     // The list should now be shown. 
     if (isResumed()) { 
      setListShown(true); 
     } else { 
      setListShownNoAnimation(true); 
     } 
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> loader) { 
     // This is called when the last Cursor provided to onLoadFinished() 
     // above is about to be closed. We need to make sure we are no 
     // longer using it. 
     mAdapter.swapCursor(null); 
    } 
+0

me sale El método registerListener (int, Loader.OnLoadCompleteListener ) en el cargador de tipo no es aplicable a los argumentos (int, LoaderManager.LoaderCallbacks ) – max4ever

+0

Esta publicación es un poco antigua, no estoy seguro si actualizaron algo. ¿Intentó crear un OnLoadCompleteListener en lugar de usar los LoaderCallbacks? –

Cuestiones relacionadas