Android Loader是否在单独的线程中执行其工作?

时间:2013-11-27 20:20:48

标签: java android multithreading asynchronous

我目前正在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线程?

2 个答案:

答案 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