Android页面启动速度优化利器 PreLoader

Apache
Java
Android
2018-03-14
luckybilly

预加载:android页面启动速度优化利器,在页面打开之前就预加载数据

最新版本:  

Activity打开之前就预加载数据,在Activity的UI布局初始化完成后显示预加载的数据,大大缩短启动时间。

在任意处开启预加载任务,并生成任务id,根据任务id可在任意处(一般是UI初始化完成后)开始对预加载的数据进行监听。

  • 开始进行监听时,若预加载任务未完成,则等待任务加载完成后执行监听对象的回调方法

  • 开始进行监听时,若预加载任务已完成,则直接执行监听对象的回调方法

持续优化中,欢迎watch、star关注!

Demo

Demo下载


典型应用

1. 在Application.onCreate中加载地址数据,在需要用到地址的页面中获取预加载的数据
2. 在启动页中预加载app主页所需的数据,减少用户等待时间
3. startActivity之前就开始预加载,UI初始化完成后显示预加载的数据
4. 复杂页面(UI初始化耗时较多的页面)内部在UI初始化开始之前预加载数据,UI初始化完成后显示预加载的数据
5. ListView/RecyclerView在上拉加载更多之前预加载下一页的数据

功能列表

  1. 支持网络数据、网络图片、本地图片、数据库查询及文件I/O等各种耗时操作的预加载

  2. 支持跨Activity预加载

  3. 支持下拉刷新(DataLoader重新加载一遍,加载完成后,回调所有DataListener)

  4. 支持自定义线程池

  5. 支持一个加载任务(DataLoader)对应多个监听器(DataListener)

  6. 支持为一个Activity配置多个预加载任务

  7. 支持后续添加/移除监听器(DataListener)

  8. 支持多个预加载任务分组管理

使用方法

1. 在build.gradle中添加依赖

dependencies {
    compile 'com.billy.android:pre-loader:x.x.x'
}

2. 开启预加载任务(如:在startActivity之前开启)

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";
    }
}

3. 在Activity(或Fragment)中UI初始化完成后开始监听预加载数据

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();
    }
}

4. 刷新数据,DataLoader会重新加载一遍数据,加载完成后,所有的DataListener的回调方法会被执行

PreLoader.refresh(preLoaderId);

5. 在使用完成后可以对预加载任务进行销毁(如:在onDestroy中)

PreLoader.destroy(preLoaderId);

6. 用GroupedDataLoader和GroupedDataListener来开启多个预加载任务(解决页面中有多个预加载任务时id管理不方便的问题)

//用GroupedDataLoader开启一组预加载任务,共用同一个id
int 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();


 

的码云指数为
超过 的项目
加载中

评论(1)

luckybilly
luckybilly 软件作者
性能优化力荐

暂无资讯

暂无问答

mtk preloader

preloader按照mtk的说法是MTK in-house developed loader,也就说是mtk内部开发的一个loader,那么单独编译preloader也是可以的,使用命令./mk project_name n pl。......

2018/03/16 08:34
18
0
Html5添加移动手机和桌面设备使用的模块化JavaScript图片画廊插件教程

一、使用方法 <link rel="stylesheet" href="path/to/photoswipe.css"> <link rel="stylesheet" href="path/to/default-skin/default-skin.css"> <script src="path/to/photoswipe.min.js"><...

2016/01/11 15:14
24
1
arts-week10

Algorithm 905. Sort Array By Parity - LeetCode Review Who’s Afraid of the Big Bad Preloader? 一文读懂前端缓存 一个网络请求3个步骤:请求,处理,响应,而前端缓存主要在请求处响应这两步...

2018/09/24 04:47
13
0
Android Browser学习一 application的初始化

Android Browser 是一个非常好的学习资料, 使用了自己设计的MVC架构,来管理书签, 浏览器 等各个功能,有具有一定的稳定性,知道我们学习 Browser是从Application开始启动的,启动流程如下: 代码...

2014/02/08 15:18
1K
3
FLEX 加载进度条自定义

import flash.display.GradientType; import flash.display.Graphics; import flash.display.Loader; import flash.display.Sprite; import flash.events.Event; import flash.events.Progre...

2013/11/12 11:13
164
0
利用CSS、JavaScript及Ajax实现图片预加载的三大方法

图片的加载速度往往影响着网站整体的用户体验,尤其对于包含大量图片的网站。对图片进行预加载,不失为一个高效的解决方案。如何实现预加载?本文将例举利用CSS、JavaScript及Ajax实现图片预...

2013/12/08 15:30
186
0
心得总结:Java性能优化技巧集锦4

3.1 用JAR压缩类文件   Java档案文件(JAR文件)是根据JavaBean标准压缩的文件,是发布JavaBean组件的主要方式和推荐方式。JAR档案有助于减少文件体积,缩短下载时间。例如,它有助于Apple...

2014/05/11 15:06
7
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部