# LoadSir **Repository Path**: HarmonyOS-tpc/LoadSir ## Basic Information - **Project Name**: LoadSir - **Description**: LoadSir是一个高效易用,低碳环保,扩展性良好的加载反馈页管理框架,在加载网络或其他数据时候,根据需求切换状态页面, 可添加自定义状态页面,如加载中,加载失败,无数据,网络超时,如占位图,登录失效等常用页面 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 9 - **Forks**: 2 - **Created**: 2021-02-23 - **Last Updated**: 2024-05-29 ## Categories & Tags **Categories**: harmonyos-advanced **Tags**: None ## README LoadSir --- `LoadSir`是一个高效易用,低碳环保,扩展性良好的加载反馈页管理框架,在加载网络或其他数据时候,根据需求切换状态页面, 可添加自定义状态页面,如加载中,加载失败,无数据,网络超时,如占位图,登录失效等常用页面。可配合网络加载框架,结合返回 状态码,错误码,数据进行状态页自动切换,封装使用效果更佳。 使用场景 --- | **in Ability**|**in Component**| ## 集成 ### 方案一 ``` 添加har包到lib文件夹内 在entry的gradle内添加如下代码 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,titile Component) * 可设置重新加载点击事件(OnReloadListener) * 可自定义状态页(继承Callback类) * 可在子线程直接切换状态 * 可设置初始状态页(常用进度页作为初始状态) * 可扩展状态页面,在配置中添加自定义状态页 * 可全局单例配置,也可以单独配置 开始使用LoadSir --- LoadSir的使用,只需要简单的三步 ### 第一步:配置 ###### 全局配置方式 全局配置方式,使用的是单例模式,即获取的配置都是一样的。可在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(); } } ``` ###### 单独配置方式 如果你即想保留全局配置,又想在某个特殊页面加点不同的配置,可采用该方式。 ```java LoadSir loadSir = new LoadSir.Builder() .addCallback(new LoadingCallback()) .addCallback(new EmptyCallback()) .addCallback(new ErrorCallback()) .build(); loadService = loadSir.register(this, new Callback.OnReloadListener() { @Override public void onReload(Component v) { // 重新加载逻辑 } }); ``` ### 第二步:注册 ###### 在Ability中使用 ```java @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 -> { }); } ``` ###### 在Component 中使用 ```java @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(new Runnable() { @Override public void run() { Log.d("1-" + Thread.currentThread().getName()); handler2.sendEvent(0); } }, 5000); }); } ### 第三步: 回调 ###### 直接回调 ```java protected void loadNet() { // 进行网络访问... // 进行回调 loadService.showSuccess();//成功回调 loadService.showCallback(EmptyCallback.class);//其他回调 } ``` ###### 转换器回调 (推荐使用) 如果你不想再每次回调都要手动进行的话,可以选择注册的时候加入转换器,可根据返回的数据,适配对应的状态页。 ```java LoadService loadService = LoadSir.getDefault().register(this, new Callback.OnReloadListener() { @Override public void onReload(Component v) { // 重新加载逻辑 }}, new Convertor() { @Override public Class map(HttpResult httpResult) { Class 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为了完全解耦,没有预设任何状态页,需要自己实现,开发者自定义自己的回调页面,比如加载中,没数据,错误,超时等常用页面, 设置布局及自定义点击逻辑 ```java public class CustomCallback extends Callback { //填充布局 @Override protected int onCreateView() { return R.layout.layout_custom; } //当前Callback的点击事件,如果返回true则覆盖注册时的onReloa(),如果返回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; } //是否在显示Callback视图的时候显示原始图(SuccessView),返回true显示,false隐藏 @Override public boolean getSuccessVisible() { return super.getSuccessVisible(); } //将Callback添加到当前视图时的回调,Component为当前Callback的布局Component @Override public void onAttach(Context context, Component view) { super.onAttach(context, view); } //将Callback从当前视图删除时的回调,Component为当前Callback的布局Component @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("fine, no data. You must fill it!"); } }); ``` ### LoadSir自带便携式Callback ```java ProgressCallback loadingCallback = new ProgressCallback.Builder() .setTitle("Loading", R.style.Hint_Title) .build(); HintCallback hintCallback = new HintCallback.Builder() .setTitle("Error", R.style.Hint_Title) .setSubTitle("Sorry, buddy, I will try it again.") .setHintImg(R.drawable.error) .build(); LoadSir loadSir = new LoadSir.Builder() .addCallback(loadingCallback) .addCallback(hintCallback) .setDefaultCallback(ProgressCallback.class) .build(); ```