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
}
}