Google Android新框架jetpack相关讲解Room、WorkManager、LifeCycles、LiveData、ViewModel、DataBinding等讲解

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jay100500/article/details/80601095
        Google在2018 Google I/O 2018大会上发布了新的框架组件,大致如上图所示。Android Jetpack 能帮助您加快应用开发速度,处理类似后台任务、UI 导航以及生命周期管理之类的活动,免去开发者编写样板代码的麻烦,专注提升应用体验。包括这几部分:Architecture、Foundation、Behavior 以及 UI。并且这些组件都发布了2个语言版本的库,一个是基于Java的,另一个就是基于Kotlin的。

        很多的开发者估计还在使用几年前的框架和产品,对新发布的很陌生,不知道如何使用。经过几天的阅读官方英文文档的学习,整理了下基本的用法和特点,其中我认为WorkManager很强大,需要的地方可以替代以前的方案。LifeCycles也不错,扩展其他类具有关联生命周期的。还有Room数据库的框架,简单了很多。LiveData和ViewModel的结合基本上就是RxJava和RxAndroid的结合的功能了。对于DataBinding,可能耦合性太高,不太方便使用。主要大家需要了解的就是这几个,其他的可以了解。

    好了,先给个官方的文档地址吧:https://developer.android.google.cn/jetpack/

    先来讲解WorkManager这个框架。

    WorkManager真的很强大,从名字就可以大概看出来,是任务管理的。很多人之前都在想什么进程守护,进程保活,APP的后台Service被杀死了怎么办?WorkManager的特点就是可以在APP被杀死、关闭、甚至机器重启后还会继续执行你设置的任务,并且你可以个性化设置你的任务执行的时间段、范围,例如在APP存活时?充电时?电量低时?...等等。可以执行一次任务、可以定时执行等等。有了WorkManager,你之前担心的问题都迎刃而解。不过我一直在想,Google开放了这么大权限的框架和API,会产生很多后台杀不死的流氓软件吧?会造成系统更卡,更耗电,更不安全吧?具体不清楚。


官方也说了,即时你强制关闭了APP,任务也会照样可以正常执行。

那么,接下来我们看看WorkManager的用法。

1、创建一个Work类,继承自Worker,里面写具体的任务逻辑。

package com.google.androidarc.utils;

import android.support.annotation.NonNull;

import androidx.work.Worker;

public class TestWork extends Worker {

    @NonNull
    @Override
    public WorkerResult doWork() {
        //  System.out.println("执行任务,非UI线程");
        return WorkerResult.SUCCESS;
    }
}

2、运行一次任务,多个任务,周期性执行任务,也可以传入和传出数据,为了方便,我就写在一起了。

private void worker() {
        //数据传输
        Data data = new Data.Builder().putString("string", "text").build();

        //设置任务约束
        Constraints constraints = new Constraints.Builder()
//                .setRequiresDeviceIdle(true)
//                .setRequiresCharging(true)
                .setRequiredNetworkType(NetworkType.CONNECTED)
                .build();

        //运行一次任务
        OneTimeWorkRequest oneTimeWorkRequest = new OneTimeWorkRequest.Builder(TestWork.class).setInitialDelay(5, TimeUnit.SECONDS)
                .setConstraints(constraints)
                .setInputData(data).addTag("tag").build();
        WorkManager.getInstance().enqueue(oneTimeWorkRequest);

        //周期定期执行任务
        PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest.Builder(TestWork.class, 5000, TimeUnit.MILLISECONDS).build();
        WorkManager.getInstance().enqueue(periodicWorkRequest);

        //链式执行任务
        WorkContinuation chain1 = WorkManager.getInstance()
                .beginWith(oneTimeWorkRequest)
                .then(oneTimeWorkRequest);
        WorkContinuation chain2 = WorkManager.getInstance()
                .beginWith(oneTimeWorkRequest)
                .then(oneTimeWorkRequest);

        WorkContinuation chain3 = WorkContinuation
                .combine(chain1, chain2)
                .then(oneTimeWorkRequest);
        chain3.enqueue();

        //输出任务结果
        WorkManager.getInstance().getStatusesByTag("tag").observe(this, new Observer<List<WorkStatus>>() {
            @Override
            public void onChanged(@Nullable List<WorkStatus> workStatuses) {
                if (workStatuses != null && workStatuses.get(0).getState().isFinished()) {
                    String result = workStatuses.get(0).getOutputData().getString("string", "");
                    System.out.println("输出:" + result);
                }
            }
        });
    }

3、接收的地方接收数据可以这样写,也可以输出结果数据回调。

package com.google.androidarc.utils;

import android.support.annotation.NonNull;

import androidx.work.Data;
import androidx.work.Worker;

public class TestWork extends Worker {

    @NonNull
    @Override
    public WorkerResult doWork() {
        System.out.println("执行" + getInputData().getString("string", ""));
        Data data = new Data.Builder().putString("string", "执行" + getInputData().getString("string", "")).build();
        setOutputData(data);
        return WorkerResult.SUCCESS;
    }
}

展开阅读全文

没有更多推荐了,返回首页