PreLoader: Сделайте запуск активности быстрее
Предварительно загружайте данные перед открытием Activity и отображайте их в пользовательском интерфейсе после инициализации UI. Ускорьте запуск Activity.
Вы можете запустить PreLoader где угодно и начать прослушивать данные, загруженные PreLoader с помощью preLoaderId.
Непрерывная оптимизация, смотрите и добавляйте звёзды!
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);
//DataLoader, имитация загрузки данных из сети
class Loader implements DataLoader<String> {
@Override
public String loadData() {
//этот метод выполняется в пуле потоков
// загрузите данные в этом методе синхронно
try {
Thread.sleep(600);
} catch (InterruptedException ignored) {
}
return "данные с сетевого сервера";
}
}
PreLoader.listenData(preLoaderId, new Listener());
//после завершения загрузки данных DataListener.onDataArrived(...) будет вызван для обработки данных
class Listener implements DataListener<String> {
@Override
public void onDataArrived(String data) {
// этот метод выполняется в основном потоке, обработчик не требуется
Toast.makeText(activity, data, Toast.LENGTH_SHORT).show();
}
}
PreLoader.refresh(preLoaderId);
PreLoader.destroy(preLoaderId);
//запустите задачу предварительной загрузки с группой 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
``` **Строка loadData()**
TimeWatcher timeWatcher = TimeWatcher.obtainAndStart("GroupedDataLoader1 загружает данные");
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 загружает данные");
try {
Thread.sleep(400);
} catch (InterruptedException ignored) {
}
return timeWatcher.stopAndPrint();
}
**@Override**
public String keyInGroup() {
return "loader2";
}
}
// Слушаем данные в Activity после инициализации UI с помощью GroupedDataListener(s) для каждого GroupedDataLoader(s).
// GroupedDataListener сопоставляется с GroupedDataLoader по ключу.
PreLoader.listenData(preLoaderId, new DataHolder1(), new DataHolder2());
class DataHolder1 реализует 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 реализует 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](https://github.com/luckybilly/CC) — это фреймворк с AOP на уровне компонентов: когда компонент вызывает запуск активности, вы можете запустить предварительную загрузку для него. Таким образом, вам не нужно выполнять предварительную загрузку в каждом месте, где вы хотите запустить активность.
1. Определите компонент для открытия активности.
```java
public class ComponentA реализует 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;
}
}
Вызовите этот компонент через CC, чтобы открыть активность.
// предварительная загрузка здесь не нужна, логика компонента полностью внутри самого компонента
CC.obtainBuilder("demo.ComponentA").build().call();
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )