需求分析
在做GankIO客户端App时,有这样一种需求:类似微信消息列表界面,每次进入该界面时,都会先显示本地的数据,同时向服务器拉取最新的数据,减少用户等待数据的时间,以增强用户体验。
概要设计
我已经使用RxJava中的merge操作符实现该需求。现在如果不用RxJava框架,这个怎么实现?如何封装一个好用的模块给上层使用?
这里需要同时在本地、服务器拉取数据,而且两件事情都做完后,整个事情才做完,故我们设计两个任务并行执行。
class DataFetcher{
LocalDataFetcher;
RemoteDataFetcher;
}
线程上下文切换的工作交给AsyncTask内部的Handler处理,这样基本的数据结构就完成了。
编码实现
底层DataFetcher模块:
package com.liguang.datafetcher;
import android.os.AsyncTask;
import android.util.Log;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 并行加载本地和远程数据
*/
public class DataFetcher {
private static final String TAG = "DataFetcher";
/**
* 上层,只在主线程读写
*/
private WeakReference<Callback> mRef;
private Worker mLocalFetcher;
private Worker mRemoteFetcher;
private String mUrl;
public DataFetcher(String url, Callback callback) {
mRef = new WeakReference<>(callback);
mUrl = url;
//假数据
mLocalFetcher = new Worker(500, new String[]{
"D", "E", "F"});
mRemoteFetcher = new Worker(2500, new String[]{
"A", "B", "C", "D", "E", "F"});
}
/**
* 页面退出时需要调用该方法
*/