我目前在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線程?
使用AsyncTaskLoader作爲基礎 – pskink
或使用AsyncQueryHandler所以你可以使用它witg定製的ContentProvider – pskink
我從AsyncTaskLoader切換,因爲它是很難與我所提到的庫來使用。編寫我自己的loader要容易得多(正如你上面看到的)。 – janoliver