数据预取小轮子

在Android开发中,预取数据可以说是一个比较通用的功能,通过预取数据可以有效的减少用户等待的时间,提升用户体验,是一种常见的以空间换取时间的策略。虽然说预取数据这个功能比较好实现,但一直没有发现一个好用的开源库实现,于是自己花了点时间写了一个,尽量做到简单优雅、轻量和侵入性低GITHUB地址

Prefetch

一个通用的数据预取库

  • 简单优雅、轻量和侵入性低
  • 如果之前使用RxJava,那么完全可以重用之前的数据加载逻辑

预览

Gradle依赖

implementation 'com.tubb:prefetch:1.1.0'
复制代码

如何使用

  • 先要继承 FetchTask 类, 定义好数据加载任务,可以看到execute()方法返回的是RxJava中的Obserable类型,默认的执行线程为Schedulers.io(),执行结果通知线程为AndroidSchedulers.mainThread(),当然这两者都可以通过覆写相应的方法来指定
public class UserInfoFetchTask extends FetchTask<UserInfo> {
    @Override
    public Observable<UserInfo> execute() {
        return Observable.create(new ObservableOnSubscribe<UserInfo>() {
            @Override
            public void subscribe(ObservableEmitter<UserInfo> emitter) throws Exception {
                // just for test
                Thread.sleep(5000);
                UserInfo userInfo = new UserInfo();
                userInfo.name = "BingBing";
                emitter.onNext(userInfo);
            }
        });
    }
}
复制代码
protected Scheduler subscribeOnScheduler() {
	return SchedulerProvider.io();
}

protected Scheduler observeOnScheduler() {
	return SchedulerProvider.ui();
}
复制代码
  • 然后就可以执行定义好的任务,框架会帮你生成一个taskId,作为任务的唯一标识,后续注册数据加载结果监听器要指定对应的taskId
public class MainActivity extends AppCompatActivity {
    private long taskId;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onResume() {
        super.onResume();
        // prefetch user info data
        taskId = Prefetch.instance().executeTask(new UserInfoFetchTask());
    }

    public void viewClick(View view) {
        Intent intent = new Intent(this, UserInfoActivity.class);
        intent.putExtra("taskId", taskId);
        startActivity(intent);
    }
}
复制代码
  • 注册数据加载结果监听器,拿到预取到的数据
public class UserInfoActivity extends AppCompatActivity implements FetchTask.Listener<UserInfo> {
    private static final String TAG = "Prefetch";
    private long taskId;
    private TextView tv_user_name;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_info);
        tv_user_name = findViewById(R.id.tv_user_name);
        taskId = getIntent().getLongExtra("taskId", 0L);
    }

    @Override
    protected void onResume() {
        super.onResume();
        Prefetch.instance().registerListener(taskId, this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        Prefetch.instance().unregisterListener(taskId);
    }

    @Override
    public void onExecuting() {
        tv_user_name.setText(String.format("%s task executing", taskId));
    }

    @Override
    public void onSuccess(UserInfo userInfo) {
        tv_user_name.setText(userInfo.name);
        Prefetch.instance().finishTask(taskId);
    }

    @Override
    public void onError(Throwable throwable) {
        tv_user_name.setText(String.format("%s task error", taskId));
        Log.e(TAG, taskId + " task", throwable);
        Prefetch.instance().finishTask(taskId);
    }
}
复制代码

Custom

可以通过PrefetchConfig 来配置TaskIdGeneratorTaskExecutor,实现自己特殊的业务场景

public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        // init Prefetch
        Prefetch.instance().init(new PrefetchConfig.Builder()
                .taskIdGenerator(new UUIDTaskIdGenerator())
                .taskExecutor(new TestTaskExecutor())
                .build());
    }
}
复制代码

注意事项

  • 一个预取任务只能执行一次,如果想重用,必须结束已经执行过的预取任务
Prefetch.instance().finishTask(taskId);
复制代码
  • 必须正确的注销数据加载结果监听器,否则会导致内存泄漏,可能会泄漏Activity,或其他监听器对象持有者实例
Prefetch.instance().unregisterListener(taskId);
复制代码

转载于:https://juejin.im/post/5ab65bc2f265da238d50ab75

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值