美文网首页
Android-推荐一个页面预加载框架(PreLoader)

Android-推荐一个页面预加载框架(PreLoader)

作者: 阿博聊编程 | 来源:发表于2022-08-30 18:00 被阅读0次
    图片来源网络,入侵必删
    在日常的Android开发当中,我们可能会遇到一些提高用户体验的黑科技技术。这篇博客分享一个页面预加载框架——PreLoader

    PreLoader的应用场景

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

    PreLoader主要功能

    • 支持网络数据、网络图片、本地图片、数据库查询及文件I/O等各种耗时操作的预加载
    • 支持跨Activity预加载
    • 支持下拉刷新(DataLoader重新加载一遍,加载完成后,回调所有DataListener)
    • 支持自定义线程池
    • 支持一个加载任务(DataLoader)对应多个监听器(DataListener)
    • 支持为一个Activity配置多个预加载任务
    • 支持后续添加/移除监听器(DataListener)

    PreLoader导入

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

    截止我发布博客的时候,目前版本是2.1.0.想要最新版本,请看开源库wiki

    PreLoader的使用

    开启预加载任务(如:在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";
        }
    }
    

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

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

    PreLoader.refresh(preLoaderId);
    

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

    PreLoader.destroy(preLoaderId);
    

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

    相关文章

      网友评论

          本文标题:Android-推荐一个页面预加载框架(PreLoader)

          本文链接:https://www.haomeiwen.com/subject/ruslnrtx.html