在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:PreLoader开源软件地址:https://gitee.com/luckybilly/PreLoader开源软件介绍:预加载:页面启动速度优化利器Activity打开之前就预加载数据,在Activity的UI布局初始化完成后显示预加载的数据,大大缩短启动时间。 在任意处开启预加载任务,并生成任务id,根据任务id可在任意处(一般是UI初始化完成后)开始对预加载的数据进行监听。
持续优化中,欢迎watch、star关注! demo
典型应用
功能列表
使用方法
dependencies { compile 'com.billy.android:pre-loader:x.x.x'}
int preLoaderId = PreLoader.preLoad(new Loader());Intent intent = new Intent(this, PreLoadBeforeLaunchActivity.class);intent.putExtra("preLoaderId", preLoaderId);startActivity(intent);//预加载任务:模拟网络接口请求获取数据class Loader implements DataLoader<String> { @Override public String loadData() { //此方法在线程池中运行,无需再开子线程去加载数据 try { Thread.sleep(600); } catch (InterruptedException ignored) { } return "data from network server"; }}
PreLoader.listenData(preLoaderId, new Listener());//数据加载完成后,会调用DataListener.onDataArrived(...)来处理加载后的数据class Listener implements DataListener<String> { @Override public void onDataArrived(String data) { //此方法在主线程中运行,无需使用Handler切换线程运行 Toast.makeText(activity, data, Toast.LENGTH_SHORT).show(); }}
PreLoader.refresh(preLoaderId);
PreLoader.destroy(preLoaderId);
//用GroupedDataLoader开启一组预加载任务,共用同一个idint preLoaderId = PreLoader.preLoad(new Loader1(), new Loader2());Intent intent = new Intent(this, PreLoadGroupBeforeLaunchActivity.class);intent.putExtra("preLoaderId", preLoaderId);startActivity(intent);class Loader1 implements GroupedDataLoader<String> { @Override public String loadData() { TimeWatcher timeWatcher = TimeWatcher.obtainAndStart("GroupedDataLoader1 load data"); try { Thread.sleep(600); } catch (InterruptedException ignored) { } return timeWatcher.stopAndPrint(); } @Override public String keyInGroup() { return "loader1"; }}class Loader2 implements GroupedDataLoader<String> { @Override public String loadData() { TimeWatcher timeWatcher = TimeWatcher.obtainAndStart("GroupedDataLoader2 load data"); try { Thread.sleep(400); } catch (InterruptedException ignored) { } return timeWatcher.stopAndPrint(); } @Override public String keyInGroup() { return "loader2"; }}//在UI初始化完成后开始用GroupedDataListener对数据进行监听//GroupedDataListener 与 GroupedDataLoader 之间用key进行关联// 可以一次开启多个监听PreLoader.listenData(preLoaderId , new DataHolder1() , new DataHolder2());//也可以分别监听PreLoader.listenData(preLoaderId, new DataHolder1());PreLoader.listenData(preLoaderId, new DataHolder2());class DataHolder1 implements GroupedDataListener<String> { @Override public void onDataArrived(String data) { String s = allTime.stopAndPrint(); logTextView.append(data + "\n" + s + "\n"); } @Override public String keyInGroup() { return "loader1"; }}class DataHolder2 implements GroupedDataListener<String> { @Override public void onDataArrived(String data) { String s = allTime.stopAndPrint(); logTextView.append(data + "\n" + s + "\n"); } @Override public String keyInGroup() { return "loader2"; }} 配合组件化开发框架( CC )使用效果更佳CC框架自带组件层级的AOP,在组件被调用打开Activity之前进行预加载,不需要在每个打开这个Activity的地方调用预加载。 组件定义打开Activity的功能: public class ComponentA implements IComponent { @Override public String getName() { return "demo.ComponentA"; } @Override public boolean onCall(CC cc) { int preLoaderId = PreLoader.preLoad(new Loader()); Intent intent = new Intent(this, PreLoadBeforeLaunchActivity.class); intent.putExtra("preLoaderId", preLoaderId); startActivity(intent); CC.sendCCResult(cc.getCallId(), CCResult.success()); return false; }} 调用打开PreLoadBeforeLaunchActivity的组件: //不需要执行预加载,加载数据的逻辑在页面所属的组件内部完成CC.obtainBuilder("demo.ComponentA").build().call(); |
请发表评论