LoadSir
— это эффективный, удобный в использовании, экологичный и легко расширяемый менеджер страниц отклика на загрузку. Он позволяет переключаться между состояниями страниц при загрузке данных с сети или других источников данных. Можно добавлять пользовательские страницы состояний, такие как "Загрузка", "Ошибка загрузки", "Нет данных", "Превышено время ожидания" и другие часто используемые страницы. LoadSir
может работать вместе с сетевыми загрузочными фреймворками, автоматически переключаясь между страницами состояний в зависимости от кода ответа, ошибки или данных.
в Ability | в Component |
---|
Добавьте артефакты HAR в папку lib.
Добавьте следующий код в gradle файл entry.
implementation fileTree(dir: 'libs', include: ['*.jar', '*.har'])
implementation project(':library')
implementation 'io.openharmony.tpc.thirdlib:LoadSir:1.0.2'
```Функционал и особенности LoadSir
---
* :star: Поддерживает Ability, Component
* :star: Использует шаблоны для преобразования входных сигналов и выходных состояний, что позволяет автоматически адаптировать страницы состояний в зависимости от кода ответа или данных, обеспечивая глобальное автоматическое переключение состояний
* :star: Не требует изменения файлов макета
* :star: Загружает только одну страницу состояния, не предварительно загружая все страницы
* :star: Не требуется установление значений состояний через перечисления или константы; можно использовать тип класса состояния (xxx.class) в качестве кода состояния
* :star: Возможность установки событий нажатия для каждой отдельной страницы состояния, где возвращаемое значение boolean может заменять или дополнять OnReloadListener, например, переход на страницу настроек при сетевой ошибке
* :star: Отсутствие предопределённых страниц, что снижает связывание и предоставляет разработчику свободу в конфигурации
* :star: Возможность сохранения строки заголовков (Toolbar, title Component)
* Возможность установки события перезагрузки (OnReloadListener)
* Возможность создания пользовательских страниц состояний (наследование Callback класса)
* Возможность переключения состояний прямо из потока выполнения
* Возможность установки начальной страницы состояния (например, прогрессбар используется как начальная страница)* Возможность расширения страниц состояний за счет добавления пользовательских страниц в конфигурацию
* Возможность глобального единого конфигурирования или отдельного конфигурирования каждого компонентаНачало работы с LoadSir
---
Использование LoadSir требует всего трёх шагов.
### Шаг 1: Конфигурирование
#### Глобальный способ конфигурирования
Глобальный способ конфигурирования использует паттерн Singleton, то есть полученные конфигурации будут одинаковыми для всех. Конфигурация может быть добавлена в Application, где можно добавить страницы состояний и установить дефолтную страницу состояния.```java
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
LoadSir.beginBuilder()
.addCallback(new ErrorCallback()) // Добавление различных состояний страниц
.addCallback(new EmptyCallback())
.addCallback(new LoadingCallback())
.addCallback(new TimeoutCallback())
.addCallback(new CustomCallback())
.setDefaultCallback(LoadingCallback.class) // Установка по умолчанию состояния страницы
.commit();
}
}
Если вы хотите сохранить глобальную конфигурацию, но при этом внести некоторые изменения для определённой страницы, можно использовать этот метод.### Второй шаг: регистрация
@Override
public void onStart(Intent intent) {
super.onStart(intent);
setUIContent(ResourceTable.Layout_ability_normal);
loadService = LoadSir.getDefault().register(findComponentById(ResourceTable.Id_container), (Callback.OnReloadListener) v -> {
});
}
@Override public void onStart(Intent intent) { super.onStart(intent); setUIContent(ResourceTable.Layout_layout_component); Image imageView = (Image) findComponentById(ResourceTable.Id_iv_img); LoadSir loadSir = new LoadSir.Builder() .addCallback(new TimeoutCallback()) .addCallback(new LoadingCallback()) .setDefaultCallback(LoadingCallback.class) .build(); loadService = loadSir.register(imageView, (Callback.OnReloadListener) v -> { loadService.showCallback(LoadingCallback.class); createParallelTaskDispatcher("123", TaskPriority.DEFAULT).delayDispatch((Runnable) () -> { @Override public void run() { Log.d("1-" + Thread.currentThread().getName()); handler2.sendEvent(0); } }, 5000); }); }
}
protected void loadNet() {
// Выполняется сетевой запрос...
// Выполняется обратный вызов
loadService.showSuccess(); // Успешный обратный вызов
loadService.showCallback(EmptyCallback.class); // Другие обратные вызовы
}
LoadService loadService = LoadSir.getDefault().register(this, new Callback.OnReloadListener() { @Override public void onReload(Component v) { // логика повторной загрузки }}, new Convertor() { @Override public Class<? extends Callback> map(HttpResult httpResult) { Class<? extends Callback> resultCode = SuccessCallback.class; switch (httpResult.getResultCode()) { case SUCCESS_CODE:// успешный вызов обратного вызова if (httpResult.getData().size() == 0) { resultCode = EmptyCallback.class; } else { resultCode = SuccessCallback.class; } break; case ERROR_CODE: resultCode = ErrorCallback.class; break; } return resultCode; } });
Обратный вызов передается с указанием конвертора и конкретного типа данных.
```java
loadService.showWithConvertor(httpResult);
LoadSir для полной декуплированности не предполагает никаких состояний по умолчанию, поэтому вам потребуется самостоятельно реализовать свои callback страницы, такие как "Загрузка", "Нет данных", "Ошибка", "Превышено время ожидания" и другие часто используемые страницы, установите макет и создайте логику нажатия.```java public class CustomCallback extends Callback {
// Устанавливаем макет
@Override
protected int onCreateView() {
return R.layout.layout_custom;
}
// Обработка события нажатия текущего callback, если возвращается true, то заменяет событие onReload(), если false, то выполняются оба события, сначала onReloadEvent().
@Override
protected boolean onReloadEvent(final Context context, Component view) {
(view.findComponentById(ResourceTable.Id_iv_gift)).setClickedListener(new Component.ClickedListener() {
@Override
public void onClick(Component component) {
}
});
return true;
}
// Возвращает true, чтобы отображать исходное изображение (SuccessView) при отображении callback страницы, и false, чтобы скрывать его.
@Override
public boolean getSuccessVisible() {
return super.getSuccessVisible();
}
// Вызывается при добавлении callback к текущему виду, Component - это компонент макета текущего callback.
@Override
public void onAttach(Context context, Component view) {
super.onAttach(context, view);
}
// Вызывается при удалении callback из текущего вида, Component - это компонент макета текущего callback.
@Override
public void onDetach() {
super.onDetach(context, view);
}
}
### Динамическое изменение callback
```java
loadService = LoadSir.getDefault().register(...);
loadService.setCallBack(EmptyCallback.class, new Transport() {
@Override
public void order(Context context, Component view) {
Text mTvEmpty = (Text) view.findComponentById(ResourceTable.Id_tv_empty);
mTvEmpty.setText("Хорошо, нет данных. Вам следует заполнить это!");
}
});
ProgressCallback loadingCallback = new ProgressCallback.Builder()
.setTitle("Загрузка", R.style.Hint_Title)
.build();
```HintCallback hintCallback = new HintCallback.Builder()
.setTitle("Ошибка", R.style.Hint_Title)
.setSubTitle("Извините, друг, я попробую ещё раз.")
.setHintImg(R.drawable.error)
.build();
```Загрузите объект LoadSir следующим образом:
```java
LoadSir loadSir = new LoadSir.Builder()
.addCallback(loadingCallback)
.addCallback(hintCallback)
.setDefaultCallback(ProgressCallback.class)
.build();
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )