2013-11-27 111 views
1

我目前在Android中實現我自己的Loader,因爲我正在使用庫來加載內容,只通過回調公開它的API,我仍然想使用加載器的好處。Android Loader是否在單獨的線程中執行其工作?

我想使用的庫可以照顧自己異步運行,或者我可以強制它同步運行並自己執行線程。 Android的文檔告訴我下面的:

在Android 3.0的推出,裝載機可以很容易在活動或片段異步加載 數據。裝載機具有以下特點:

...

  • 他們提供數據的異步加載。

...

這我理解爲如果Loader總是在自己的線程中運行,asynchroneously執行的任務。但是,如果我再告訴我要synchroneously履行請求庫,我得到以下異常:

AsyncHttpRequest: Unhandled exception origin cause 
    android.os.NetworkOnMainThreadException 
      at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145) 

所以好像我在Loader運行在主線程上執行後,所有的工作,讓我感到驚喜。代碼如下所示:

public abstract class AsyncHTTPLoader<E> extends Loader<E> { 
    private Network2 mNetwork; 
    private String mRequestUrl; 

    private AsyncHttpResponseHandler mHandler = new AsyncHttpResponseHandler() { 
     @Override 
     public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { 
      AsyncHTTPLoader.this.processResponse(new String(responseBody)); 
     } 
    }; 

    public AsyncHTTPLoader(Context context, String url) { 
     super(context); 

     mRequestUrl = url; 
     mNetwork = new Network2(getContext()); 
    } 

    protected void processResponse(String response) { 
     E result = parseResponse(response); 
     deliverResult(result); 
    } 

    @Override 
    protected void onForceLoad() { 
     super.onForceLoad(); 
     Utils.log(mRequestUrl); 
     mNetwork.get(mRequestUrl, mHandler); 
    } 

    public abstract E parseResponse(String response); 
} 

我是否需要照顧自己的加載程序中的線程?如果我使用我使用的庫的異步功能,processResponse()函數是否會阻止我的應用程序的UI線程?

+0

使用AsyncTaskLoader作爲基礎 – pskink

+1

或使用AsyncQueryHandler所以你可以使用它witg定製的ContentProvider – pskink

+0

我從AsyncTaskLoader切換,因爲它是很難與我所提到的庫來使用。編寫我自己的loader要容易得多(正如你上面看到的)。 – janoliver

回答

0

您可以使用AsyncTaskLoader類爲您創建一個後臺線程。

+0

我從AsyncTaskLoader切換,因爲它很難與我提到的庫一起使用。編寫我自己的loader要容易得多(正如你上面看到的)。 – janoliver

0

這個異常由於在UI線程上運行網絡操作,如果你想使用loader管理器進行網絡操作,你必須擴展AsyncTaskLoader,並在loadInBackground()中做你的網絡操作,實際上這個方法叫on後臺線程。

例如:

MyLoader extends AsyncTaskLoader<List<MyItem>> { 
    @Override 
    public List<SampleItem> loadInBackground() { 

     List<MyItem> itemsList = new ArrayList<MyItem>(); 

     // TODO: 

    return data; 
    } 
} 

的更詳細的例子,你可以參考這個link

相關問題