盒子
盒子
文章目录
  1. AsyncTaskLoader
  2. 基本用法
    1. 创建一个继承于AsyncTaskLoader的自定义Loder类
    2. 实现android.support.v4.app.LoaderManager.LoaderCallbacks接口
    3. 示例代码
  3. 注意

AsyncTaskLoader解析

AsyncTaskLoader

1
2
↳ android.support.v4.content.Loader<D>
↳ android.support.v4.content.AsyncTaskLoader<D>

基本用法

创建一个继承于AsyncTaskLoader的自定义Loder类

cancelLoadInBackground

实现以下三个常用方法和一个默认构造函数:

1
2
3
4
5
6
7
8
9
10
11
public SycnTasker(@NonNull Context context) {}

@Override
protected void onStartLoading() {}

@Nullable
@Override
public Integer loadInBackground() {}

@Override
protected boolean onCancelLoad() {}

其中默认构造函数loadInBackground必不可少

  • onStartLoading
  • 在执行完方法onCreateLoader返回一个自定义Loader对象后开始执行

  • loadInBackground
  • 当在onStartLoading中调用forceLoad()时开始执行

  • onCancelLoad
  • 当调用cancleLoad方法时会执行

    实现android.support.v4.app.LoaderManager.LoaderCallbacks接口

    1
    2
    3
    4
    5
    6
    7
    8
    @Override
    public void onLoadFinished(Loader loader, D d) {}

    @Override
    public Loader onCreateLoader(int i, Bundle bundle) {}

    @Override
    public void onLoaderReset(Loader loader) {}

  • onCreateLoader
  • 当调用以下代码后开始执行

    1
    getLoaderManager().initLoader(int id,Bundle bundle,LoaderCallbacks loaderCallbacks);

  • onLoadFinished
  • 执行完成loadInBackground后,数据可从onLoadFinished参数d中获得

  • onLoaderReset
  • 自定义Loader销毁后

    各方法执行顺序:

    onCreateLoader

    onStartLoading

    loadInBackground

    示例代码

    实现LoaderCallbacks接口所在类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    import android.app.LoaderManager;
    import android.content.Loader;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    import io.githubs.grooters.luffy.R;

    public class LoaderActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Integer>{
    private static final String TAG= LoaderActivity.class.getSimpleName();
    private AsyncTasker asyncTasker;
    @Override
    protected void onCreate(@Nullable final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_loader);
    getLoaderManager().initLoader(1,savedInstanceState,this);

    @Override
    public void onLoadFinished(Loader loader, Integer i) {
    Log.i(TAG,"onLoadFinished:"+i);
    }

    @Override
    public Loader onCreateLoader(int i, Bundle bundle) {
    Log.i(TAG,"onCreateLoader");
    CustomLoader customLoader=new CustomLoader(this);
    customLoader.getInfo("LoaderActivity");
    return customLoader;
    }

    @Override
    public void onLoaderReset(Loader loader) {
    Log.i(TAG,"onLoaderReset");
    }

    }

    自定义Loader:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    import android.content.AsyncTaskLoader;
    import android.content.Context;
    import android.content.Intent;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.util.Log;
    import luffy_intent.Intenter;

    public class CustomLoader extends AsyncTaskLoader<Integer> {

    private static final String TAG=CustomLoader.class.getSimpleName();
    public CustomLoader(@NonNull Context context) {
    super(context);
    Log.i(TAG,"CustomLoader");
    }
    @Override
    protected void onStartLoading() {
    super.onStartLoading();
    Log.i(TAG,"onStartLoading");
    forceLoad();
    }
    @Nullable
    @Override
    public Integer loadInBackground() {
    Log.i(TAG,"loadInBackground");
    int i=0;
    while(i<10){
    try {
    Thread.sleep(1000);
    ++i;
    Log.i(TAG,"i: "+i);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    Log.i(TAG,"Finish");
    }
    return i;
    }
    @Override
    protected boolean onCancelLoad() {
    Log.i(TAG,"onCancelLoad");
    return super.onCancelLoad();
    }
    public void getInfo(String str){
    Log.i(TAG,"getInfo:"+str);
    }
    }

    注意

    cancelLoadInBackground终止loadInBackground,但loadInBackground中的任务还在执行

    只能从主线程调用, 注意cancel并不是一个及时生效的操作,因为load操作是在另外一个线程运行的, 如果现在load正在进行中,那么cancel的作用是在load完成以后才会将loader 清除,而这时候如果有了其他的load请求过来,那么这个请求会一直pendig知道这个要被取消的loader真正被取消 , 在这种情况下, onLoadCancelListener会在load完成以后被调用

    与AsyncTask不同,AsyncTaskLoader将根据之前在Loader Manager中注册的Loader ID重新使用,因此避免重新执行网络事务。

    getLoaderManager().initLoader(1,savedInstanceState,this);

    支持一下
    扫一扫,支持Grooter
    • 微信扫一扫
    • 支付宝扫一扫