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。