Jetpack之ViewModel、WorkManager的使用

ViewModel

ViewModel类旨在以注重生命周期的方式存储和管理界面相关的数据。通常在系统首次调用Activity(Fragment也适用)对象的onCreate()方法时请求ViewModel。系统可能会在Activity的整个生命周期内多次调用onCreate(),如在旋转设备屏幕。ViewModel存在的时间范围是从您首次请求ViewModel直到Activity完成并销毁。


ViewModel的生命周期

案例:当手机屏幕旋转时,数据不会重新初始化。

MyViewModel.java

// 步骤一:创建实体类,继承 ViewModel
public class MyViewModel extends ViewModel {

    public int number = 0;

}

OneActivity.java

public class OneActivity extends AppCompatActivity {

    private TextView textView;
    private MyViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_vone);

        Log.i("xxx", "--->onCreate");
        textView = findViewById(R.id.text);

        // 步骤二:获取 ViewModel 对象
        viewModel = new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory(getApplication()))
                .get(MyViewModel.class);

        // 每次旋转屏幕,Activity 都会重新进入生命周期,但 viewModel.number 的值不会重新初始化
        textView.setText(String.valueOf(viewModel.number));
    }

    // 按钮的点击事件
    public void plus(View view) {
        textView.setText(String.valueOf(++viewModel.number));
    }

}

WorkManager

WorkManager是适合用于持久性工作的推荐解决方案。如果工作始终要通过应用重启和系统重新启动来调度,便是永久性的工作。由于大多数后台处理操作都是通过持久性工作完成的,因此WorkManager是适用于后台处理操作的主要推荐API。

类型

WorkManager可处理三种类型的永久性工作:

  • 立即执行:必须立即开始且很快就完成的任务,可以加急。
  • 长时间运行:运行时间可能较长(有可能超过 10 分钟)的任务。
  • 可延期执行:延期开始并且可以定期运行的预定任务。

案例:WorkManager的使用(作用:日志的上传,数据的统计...)

WorkActivity.java

public class WorkActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_work);
    }

    // 按钮的点击事件
    @RequiresApi(api = Build.VERSION_CODES.O)
    public void click(View view) {
        // 执行条件
        Constraints constraints = new Constraints.Builder()
                .setRequiredNetworkType(NetworkType.NOT_REQUIRED)       // 没网的情况下
                .build();

        // 参数
        Data inputData = new Data.Builder().putString("xxx", "Henry").build();

        // 一次性任务
        final OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(MyWork.class)
                // 执行条件
                .setConstraints(constraints)
                // 延迟执行
                .setInitialDelay(5, TimeUnit.SECONDS)
                // 退避指数(在任务执行不成功时,会重新提交任务,要配合 @1 Result.retry() )
                .setBackoffCriteria(BackoffPolicy.LINEAR, Duration.ofSeconds(2))
                // 标签
                .addTag("request")
                // 给 Work 传递参数
                .setInputData(inputData)
                .build();

        // 周期性任务,最少15分钟
        PeriodicWorkRequest workRequest = new PeriodicWorkRequest
                .Builder(MyWork.class, Duration.ofMinutes(15))
                .build();

        // 执行单个任务
        final WorkManager manager = WorkManager.getInstance(this);
        manager.enqueue(request);

//        // 按顺序执行多个任务
//        WorkManager.getInstance(this).beginWith(任务一).then(任务二).enqueue();

//        // 组合执行任务
//        WorkContinuation continuation1 = WorkManager.getInstance(this).beginWith(任务一).then(任务二);
//        WorkContinuation continuation2 = WorkManager.getInstance(this).beginWith(任务三).then(任务四);
//        List<WorkContinuation> list = new ArrayList<>();
//        list.add(continuation1);
//        list.add(continuation2);
//        WorkContinuation.combine(list).then(任务五).enqueue();

        // 监听任务状态
        manager.getWorkInfoByIdLiveData(request.getId()).observe(this, new Observer<WorkInfo>() {
            @Override
            public void onChanged(WorkInfo workInfo) {
                if (workInfo!=null && workInfo.getState()==WorkInfo.State.SUCCEEDED) {
                    String s = workInfo.getOutputData().getString("yyy");
                    Log.i("xxx", s);
                }
            }
        });

//        // 取消任务
//        new Timer().schedule(new TimerTask() {
//            @Override
//            public void run() {
//                manager.cancelWorkById(request.getId());
//            }
//        }, 2000);
    }

}

MyWork.java

public class MyWork extends Worker {

    public MyWork(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {
        String s = getInputData().getString("xxx");
        Log.i("xxx", s);

        Data d = new Data.Builder().putString("yyy", "success").build();
        return Result.success(d);        // @1
    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容