Android自定义AsyncTaskLoader的使用

一.写一个Loader继承AsyncTaskLoader例子如下:
public class ModelLoader extends  AsyncTaskLoader<L ist<Model>> {
    public ModelLoader(Context context) {
       
super (context);
    }
    public List<Model> loadInBackground() {
        return null ;
    }
}
Model为实体类,作为存储数据用

二.重写AsyncTaskLoader的方法:
deliverResult、onStartLoading、onStopLoading、onCanceled、onReset、onReleaseResources
如下:
public void deliverResult( L ist<Model> data) {
    if (isReset()) {
        if (data != null ) {
            onReleaseResources(data);
        }
    }
    L ist<Model> oldData = data;
    if (isStarted()) {
        super .deliverResult(data);
    }
    if (oldData != null ) {
        onReleaseResources(oldData);
    }
}

// 开始Loader;很重要,必须写
protected void onStartLoading() {
    if ( data   != null ) {
        deliverResult( data );
    }
    if (takeContentChanged() || data == null) {
        forceLoad();
    }
}

// 停止Loading
protected void onStopLoading() {
   
// Attempt to cancel the current load task if possible.
   
cancelLoad();
}

// 当Loader被取消,释放资源
public void onCanceled( L ist<Model> apps) {
    super .onCanceled(apps);
    onReleaseResources(apps);
}

// 当Loader重置
protected void onReset() {
    super .onReset();
    onStopLoading();
    if ( data != null ) {
        onReleaseResources(
data );
       
data = null ;
    }
}

// 当资源被释放
protected void onReleaseResources( L ist<Model> apps) {
}

三.在Activity或Fragment中使用getLoaderManger()
获取LoaderManager对象,调用initLoader(int, Bundle, Context)方法
以Fragment为例子如下:
public void onActivityCreated(Bundle savedInstanceState) {
    super .onActivityCreated(savedInstanceState);
     // 使用this后Fragment要实现 LoaderManager.LoaderCallbacks<List<Model>>接口
    getLoaderManager().initLoader(0 , null, this); 
}
// 实现LoaderCallbacks接口方法
public Loader<List<Model>> onCreateLoader( int id, Bundle args) {
    return new ModelLoader(getActivity()); 
}

public void onLoadFinished(Loader<List<Model>> loader, List<Model> data) {
     // 获取 ModelLoader中 loadInBackground方法的返回值 data
     // 对data进行处理,写写Adapter之类的
}

public void onLoaderReset(Loader<List<Model>> loader) {

}


四.改造加强
每次都需要重写 AsyncTaskLoader中的 deliverResult、onStartLoading、onStopLoading、
onCanceled、onReset、onReleaseResources方法,未免过于太笨重,我们可以写一个万能
AsyncTaskLoader,及继承了 AsyncTaskLoader的Loader-->定义为CommonLoader,当要
用到的时候直接继承 CommonLoader。
附代码:
import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;

public class CommonLoader<T > extends AsyncTaskLoader<T> {

   
private T data ;

   
public CommonLoader(Context context) {
       
super (context);
    }

    public T loadInBackground() {
       
return null ;
    }

    public void deliverResult(T data) {
        if (isReset()) {
            if (data != null) {
                onReleaseResources(data);
            }
        }
       
T oldData = data;
        if (isStarted()) {
            super.deliverResult(data);
        }
        if (oldData != null) {
            onReleaseResources(oldData);
        }
    }

    protected void onStartLoading() {
        if (data != null) {
            deliverResult( data);
        }
        if (takeContentChanged() || data == null) {
            forceLoad();
        }
    }

    protected void onStopLoading() {
        cancelLoad();
    }

    public void onCanceled(T apps) {
        super .onCanceled(apps);
        onReleaseResources(apps);
    }

    protected void onReset() {
        super .onReset();
        onStopLoading();
        if (data != null) {
            onReleaseResources(
data);
           
data = null;
        }
    }

    protected void onReleaseResources(T apps) {
    }

}

需要例子的可以直接找我要例子
QQ:1018433564 小江来了
Wechat:jym-555 江奕铭

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值