我目前正在Android中实现我自己的Loader
,因为我正在使用一个库来加载东西,只通过回调公开它的API,我仍然想要使用加载器的好处。
我想要使用的库可以处理异步运行,或者我可以强制它同步运行并自己进行线程处理。 Android文档告诉我以下内容:
在Android 3.0中引入,加载器可以轻松异步加载 活动或片段中的数据。装载机具有以下特点:
...
- 他们提供异步数据加载。
...
这解释为好像Loader
总是在自己的Thread中运行并且异步执行任务。但是,如果我告诉库我想要同时执行它的请求,我会得到以下异常:
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);
}
我是否需要自己处理装载机中的线程?如果我使用我使用的库的Async功能,processResponse()
功能是否会阻止我的应用程序的UI线程?
答案 0 :(得分:0)
您可以使用为您创建后台线程的AsyncTaskLoader类。
答案 1 :(得分:0)
此异常由于在UI线程上运行网络操作,如果要使用loader manager进行网络操作,则必须扩展AsyncTaskLoader,并在loadInBackground()中进行网络操作,实际上这个方法调用了一个背景线程。
例如:
MyLoader extends AsyncTaskLoader<List<MyItem>> {
@Override
public List<SampleItem> loadInBackground() {
List<MyItem> itemsList = new ArrayList<MyItem>();
// TODO:
return data;
}
}
有关更详细的示例,您可以参考此link。