欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-14 13:05:42
...
Google Android新框架jetpack相关讲解Room、WorkManager、LifeCycles、LiveData、ViewModel、DataBinding等讲解
        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,会产生很多后台杀不死的流氓软件吧?会造成系统更卡,更耗电,更不安全吧?具体不清楚。

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

官方也说了,即时你强制关闭了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;
    }
}