## PreLoader: Make your activity launch faster
[![Download](https://api.bintray.com/packages/hellobilly/android/pre-loader/images/download.svg)](https://bintray.com/hellobilly/android/pre-loader/_latestVersion)
[![GitHub stars](https://img.shields.io/github/stars/luckybilly/PreLoader.svg?style=social&label=Stars)](https://github.com/luckybilly/PreLoader)
[![GitHub forks](https://img.shields.io/github/forks/luckybilly/PreLoader.svg?style=social&label=Fork)](https://github.com/luckybilly/PreLoader)
[changelog](changelog.md)
[中文文档](README-zh-CN.md)
Pre-load data before Activity opens, and display data on UI after UI initialization. Speedup Activity launch
You can start a PreLoader everywhere and start to listen data which loaded by the PreLoader with preLoaderId
- if DataLoader.loadData() is not completed, then DataListener.onDataArrived() will be called after the data load is completed
- if DataLoader.loadData() is completed, then DataListener.onDataArrived() called immediately
Continuous optimization, welcome watch, star!
## demo
[demo download](demo.apk)
<img src="image/inside_page.png" height="500" /> <img src="image/before_start_activity_1.png" height="500" /> <img src="image/before_start_activity_2.png" height="500" />
## Typically used for
1. Pre-load data in Application.onCreate for HomePageActivity to reduce the user waiting time in HomePageActivity initialization
2. Pre-load data before context.startActivity(), and display data after activity UI are initialized
3. Pre-load data for complex UI Activity (UI initialization cost too much time)
4. Pre-load data for next page of ListView/RecyclerView before pull to load more
## Features
- support network data, network images, local images, database queries, and file I/O
- support for cross-activity pre-loading
- support pull-down refresh (DataLoader reloads once, after loading completes, callback for all DataListener)
- supports custom thread-pool
- support one loader (DataLoader) for multiple listeners (DataListener)
- support multiple preload tasks for an Activity
- support for add/remove listener dynamically
![image](image/PreLoader.png)
## Usage
1. add dependencies in build.gradle
```groovy
dependencies {
compile 'com.billy.android:pre-loader:x.x.x'
}
```
2. start a pre-load
```java
int preLoaderId = PreLoader.preLoad(new Loader());
Intent intent = new Intent(this, PreLoadBeforeLaunchActivity.class);
intent.putExtra("preLoaderId", preLoaderId);
startActivity(intent);
//DataLoader, mock as load data from network
class Loader implements DataLoader<String> {
@Override
public String loadData() {
//this method runs in thread pool
// load data in this method synchronously
try {
Thread.sleep(600);
} catch (InterruptedException ignored) {
}
return "data from network server";
}
}
```
3. Listen data after UI initialization in Activity/Fragment/View
```java
PreLoader.listenData(preLoaderId, new Listener());
//after data load completed,DataListener.onDataArrived(...) will be called to process data
class Listener implements DataListener<String> {
@Override
public void onDataArrived(String data) {
// this method runs on main thread, Handler is not required
Toast.makeText(activity, data, Toast.LENGTH_SHORT).show();
}
}
```
4. Refresh data: DataLoader.loadData() will be called, and DataListener.onDataArrived() will be called for all listeners
```java
PreLoader.refresh(preLoaderId);
```
5. Destroy the PreLoader object if you do not need it(eg. Activity is destroyed)
```java
PreLoader.destroy(preLoaderId);
```
6. start a group of pre-load task with GroupedDataLoader and GroupedDataListener
```java
//start pre-load task with a group of GroupedDataLoader(s)
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";
}
}
//listen data in Activity after UI initialization with GroupedDataListener(s) for each GroupedDataLoader(s)
//GroupedDataListener matched with GroupedDataLoader by key
PreLoader.listenData(preLoaderId
, new DataHolder1()
, 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";
}
}
```
## Better to use with the componentized architecture framework (CC)
[CC](https://github.com/luckybilly/CC) framework comes with AOP at the component level: when component is calling for start an activity, you can start a pre-load for it. So, it is not need to do pre-load work in every place where you want to start the Activity.
1. define a component for open the activity
```java
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;
}
}
```
call that component by CC to open activity
```java
// pre-load is needless here, the logistic of component are all inside that component itself
CC.obtainBuilder("demo.ComponentA").build().call();
```
没有合适的资源?快使用搜索试试~ 我知道了~
Android代码-Android页面启动速度优化:在页面打开之前就预加载数据
共74个文件
java:25个
xml:18个
png:11个
需积分: 32 24 下载量 21 浏览量
2019-08-06
20:34:34
上传
评论
收藏 1.6MB ZIP 举报
温馨提示
PreLoader: Make your activity launch faster changelog 中文文档 Pre-load data before Activity opens, and display data on UI after UI initialization. Speedup Activity launch You can start a PreLoader everywhere and start to listen data which loaded by the PreLoader with preLoaderId if DataLoader.loadData() is not completed, then DataListener.onDataArrived() will be called after the data load is completed if DataLoader.loadData() is completed, then DataListener.onDataArrived() called immediately
资源推荐
资源详情
资源评论
收起资源包目录
Android代码-Android页面启动速度优化:在页面打开之前就预加载数据.zip (74个子文件)
PreLoader-master
pre-loader
.gitignore 7B
build.gradle 1KB
src
main
AndroidManifest.xml 114B
res
values
strings.xml 73B
java
com
billy
android
preloader
StateLoadCompleted.java 820B
StateLoading.java 1KB
PreLoaderPool.java 4KB
StatusInitialed.java 402B
StateDone.java 839B
Worker.java 7KB
interfaces
DataListener.java 341B
GroupedDataLoader.java 363B
GroupedDataListener.java 238B
DataLoader.java 294B
PreLoaderWrapper.java 2KB
State.java 1KB
util
ILogger.java 537B
PreLoaderLogger.java 3KB
WorkerGroup.java 4KB
StateListening.java 672B
PreLoader.java 7KB
IWorker.java 1KB
StateBase.java 1KB
StateDestroyed.java 332B
proguard-rules.pro 751B
.gitignore 128B
demo.apk 1.29MB
app
.gitignore 7B
build.gradle 1KB
src
main
AndroidManifest.xml 847B
res
mipmap-xhdpi
ic_launcher.png 5KB
layout
activity_pre_load.xml 1KB
activity_main.xml 2KB
values-w820dp
dimens.xml 358B
mipmap-xxhdpi
ic_launcher.png 8KB
mipmap-hdpi
ic_launcher.png 3KB
mipmap-xxxhdpi
ic_launcher.png 10KB
values-zh-rCN
strings.xml 2KB
values
strings.xml 1KB
colors.xml 208B
dimens.xml 211B
styles.xml 383B
java
com
billy
preloader
MainActivity.java 5KB
PreLoadGroupBeforeLaunchActivity.java 3KB
PreLoadActivity.java 3KB
PreLoadBeforeLaunchActivity.java 3KB
TimeWatcher.java 2KB
settings.gradle 30B
build.gradle 644B
changelog.md 577B
gradlew 5KB
LICENSE 11KB
bintray.gradle 3KB
README-zh-CN.md 7KB
store.keystore 2KB
README.md 7KB
gradlew.bat 2KB
gradle.properties 730B
.idea
misc.xml 4KB
encodings.xml 159B
gradle.xml 682B
copyright
profiles_settings.xml 74B
runConfigurations.xml 564B
compiler.xml 727B
modules.xml 480B
image
cn_before_start_activity_1.png 90KB
cn_before_start_activity_2.png 90KB
before_start_activity_1.png 89KB
PreLoader.png 34KB
inside_page.png 60KB
before_start_activity_2.png 89KB
cn_inside_page.png 61KB
gradle
wrapper
gradle-wrapper.properties 230B
gradle-wrapper.jar 52KB
共 74 条
- 1
资源评论
weixin_39841848
- 粉丝: 509
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功