android后台任务(三):Loader

来源:互联网 发布:淘宝联盟使用红包 编辑:程序博客网 时间:2024/06/08 12:04

Loader也是android运行后台任务的方法之一,并且是谷歌推荐的,可以使用CursorLoader,也可以自定义Loader来实现异步任务,下面是使用方法。
一、编写一个自定义Loader继承自AsyncTaskLoader

    //我是在Activity内部编写,所以是静态内部类    private static class MyLoader extends android.support.v4.content.AsyncTaskLoader<String>    {        private String result;        public MyLoader(Context context)        {            super(context);        }        //判断是否已经有结果了,如果有,调用deliverResult(result),会直接回调onLoadFinished(),将result作为data传入。        @Override        protected void onStartLoading()        {            super.onStartLoading();            if (result != null)            {                deliverResult(result);            } else            {                forceLoad();            }        }        //这里写任务执行的代码,会在工作线程执行        @Override        public String loadInBackground()        {            //模拟延迟5秒            try            {                Thread.sleep(5000);            }catch (Exception e)            {            }            result = "这是查询结果";            return result;        }    }

二、让需要使用Loader的Activity或者Fragment实现LoaderManager.LoaderCallbacks接口,复写三个回调函数,可以自定义任务结果的返回类型,这里是String。

public class Test2 extends AppCompatActivity implements LoaderManager.LoaderCallbacks<String>{    //这个方法会在后台任务初始化完成之后调用    //需要让他返回一个Loader实例,而Loader实例定义了后台任务    @Override    public Loader<String> onCreateLoader(int id, Bundle args)    {        return new MyLoader(this);    }    //这个函数将在后台任务完成之后被调用,并且传入结果data    //可以在这里更新UI    @Override    public void onLoadFinished(Loader<String> loader, String data)    {        tv.setText(data);    }    @Override    public void onLoaderReset(Loader<String> loader)    {    }}

三、在需要开始执行后台任务的地方执行initLoader

getSupportLoaderManager().initLoader(1,null,this);

这是在Activity当中,Fragment中是

getLoaderManager().initLoader(URL_LOADER, null, this);

整个的执行过程是这样:
一、initLoader
二、调用onCreateLoader(),获得Loader实例
三、执行完Loader中的任务
四、调用onLoadFinished()

Loader的实现使用Asynctask,而Asynctask的实现使用Handler+Looper+Thread。

0 0
原创粉丝点击