2011-05-19 11 views
6

Sadece yeni cursorLoader ile oynamaya başladım ve sorunla karşılaşıyorum. Aşağıdaki kod, yalnızca imleçLoader'ın nasıl çalıştığını anlamak içindir, ancak bu etkinliğe devam ettiğimde şu satırı almaya devam ediyorum:Android CursorLoader

"İstenmeyen ve zaten kapatılmış imleç çalıştırılıyor". Ben cursorLoader ile oynamaya başlamadan önce uygulama iyi çalışıyordu. Herhangi bir fikir?

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; 

} 

cevap

12

İmleci loader.loadInBackground() 'dan yakalamak istediğinizi sanmıyorum. loadInBackground() için uygulama temel olarak bir sorgu yapar ve imleci UI iş parçacığı üzerinde döndürür, bu da kaçınmaya çalışmaktır.

Dönüş değeri için kullanıcı arabiriminde beklerken dikkatli olun. Bunun istediğiniz bir şey olmadığını iyi bir gösterge olmalı.

Bu sorunu gidermek için ne yaptım yükleyiciyi yeniden başlatmak oldu. Durumumda, içeriğimi aramak için işlem çubuğunu kullanmaya çalışıyorum. Sınıfım ListFragment öğesini genişletiyor ve LoaderManager.LoaderCallbacks uygular Bu etkinliği OnQueryTextListener uygular ve bu parçacığa çağrı yapmak, parçada yaptığım koddur.

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

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

Yükleyiciyi yeniden başlatmanız gerektiğini unutmayın. Yükleyicilerin hepsi sistem tarafından yönetiliyor. Bu, onCreateLoader'ınızın yeniden çağrılmasına neden olur. Yani seçiminizi ayarlamak için orada sorgu dizesi kontrol etmek zorunda kalacaksınız.

@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; 
} 

Bu, arka planda imleçYükleme işlemini başlatır. Ve geri bildirimler her zamankiyle aynı olmalıdır.

@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

i yöntem registerListener olsun (int, Loader.OnLoadCompleteListener ) tipi Loader argümanlar için geçerli değildir (int, LoaderManager.LoaderCallbacks ) – max4ever

+0

Bu gönderi biraz eski, bir şey güncelleştirdiler emin değil. LoaderCallbacks yerine bir OnLoadCompleteListener oluşturmayı denediniz mi? –