6

我有一個實現LoaderManager和使用CursorLoader的片段(沒有什麼奇特的)。我想要捕捉查詢期間拋出的異常,但我不明白!任何幫助?謝謝。處理光標加載器異常

+0

你的問題有點不清楚。你需要捕捉什麼樣的例外?你嘗試過嘗試和趕上塊? –

+0

我有這樣的事情: – denispyr

+0

My Fragment實現了LoaderManager並實現了onCreateLoader,onLoadFinished和onLoaderReset。 onCreateLoader方法創建一個CursorLoader實例。迄今爲止很好,沒有什麼幻想。現在,假設遊標嘗試運行並向Fragment傳遞內容時拋出異常。我能在哪裏找到它?請注意,我的代碼從不顯式運行遊標,這是由加載程序完成的。 – denispyr

回答

1

你需要從CursorLoader派生來完成它。類似這樣的:

class MyCursorLoader extends CursorLoader { 

    public MyCursorLoader(Context context) { 
     super(context) 
     } 

    public CursorLoader(Context context, Uri uri, String[] projection, String selection, 
      String[] selectionArgs, String sortOrder) { 
     super(context, uri, projection, selection, selectionArgs, sortOrder); 
    } 

    @Override 
    public Cursor loadInBackground() { 

     try { 
      return (super.loadInBackground); 
     } catch (YourException e) { 
      // Do your thing. 
     } 

     return (null); 
    } 

} 

你可以調整它來實現你的錯誤處理。

+0

謝謝。我試圖避免繼承,但... – denispyr

2

我試圖繼承並實現一個偵聽器,然後我試圖繼承並實現一個回調。最簡單的,少管閒事的解決辦法,在我的情況,似乎是以下

public class CursorLoaderGraceful extends CursorLoader { 
    public Throwable error; // holder 
    public CursorLoaderGraceful(Context context) { 
     super(context); 
    } 
    public CursorLoaderGraceful(Context context, Uri uri, String[] projection, String selection, 
      String[] selectionArgs, String sortOrder) { 
     super(context, uri, projection, selection, selectionArgs, sortOrder); 
    } 
    public void OnQueryException(RuntimeException throwable) { 
     throw throwable; 
    } 

    @Override 
    public Cursor loadInBackground() { 
     try { 
      return (super.loadInBackground()); 
     } catch (Throwable t) { 
      error = t; // keep it 
     } 
     return (null); 
    } 
} 

而在片段/活性

@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    CursorLoaderGraceful loader = new CursorLoaderGraceful(this., other, params, go , here); 
    // ... 
    return loader; 
} 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    //trivial code 
    mAdapter.swapCursor(data); 
    if (this.isResumed()) { 
     this.setListShown(true); 
    } else { 
     this.setListShownNoAnimation(true); 
    } 

    //check and use 
    Throwable loaderError = ((CursorLoaderGraceful)loader).error; 
    if (loaderError != null) { 
     //all these just to show it?!?!? :/ 
     Toast.makeText(this, loaderError.getMessage(), Toast.LENGTH_SHORT) 
       .show(); 
    } 
}