首页 > 其他分享 >WorkManager的用法

WorkManager的用法

时间:2023-08-14 17:33:52浏览次数:26  
标签:Worker 用法 任务 Result WorkManager new Data

一.WorkManager的作用

  绝大部分应用程序都有后台执行任务的需求,根据需求的不同,Android为后台任务提供了多种解决方案,如JobShedule,Loader,Service等。如果这些api没有被正确的使用,则可能导致消耗大量的电量。WorkManager为应用程序中那些不需要及时完成的任务提供了一个统一的解决方案,以便在设备电量和用户体验间达到一个比较好的平衡。WorkManager有三个重要特点,分别如下:

  1.针对的是不需要及时完成的任务

  2.保证任务一定被执行

  3.兼容范围广,最低能兼容API Level14

二.WorkManager的基本使用方法

  1.添加依赖:implementation 'androidx.work:work-runtime:2.8.1'

  2.使用Work类定义任务

public class MyWorker extends Worker {

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

    @NonNull
    @Override
    public Result doWork() {//耗时的任务在doWork()方法中执行
        Log.i("OneTimeWorkRequest","Work Start!");
        String inputData=getInputData().getString("key");//接收WorkManager传递来的数据
        Data outputData=new Data.Builder()
                .putString("key","value")
                .build();
        return Result.success(outputData);//给WorkManager返回数据
    }
}

  doWork()方法有3种类型的返回值:若执行成功,则返回Result.success();若执行失败,则返回Result.failure();若需要重新执行,则返回Result.retry()。

  3.使用WorkRequest配置任务

    配置任务就是在告诉系统,任务在何时运行及如何运行,下面结合代码讲解

public class MainActivity extends AppCompatActivity implements View.OnClickListener {private Constraints constraints;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Data inputData=new Data.Builder()
                .putString("key","value")
                .build();
     //设置任务触发的条件:需要联网,电量充足,正在充电 constraints=new Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .setRequiresBatteryNotLow(true) .setRequiresCharging(true) .build(); OneTimeWorkRequest oneTimeWorkRequest=new OneTimeWorkRequest.Builder(MyWorker.class)//一次性任务 .setConstraints(constraints) .setInitialDelay(10,TimeUnit.SECONDS)//触发条件满足后,延迟10s执行任务 .addTag("test")//为任务设置tag标签,之后可以通过标签跟踪任务的状态,或者取消任务 .setBackoffCriteria(BackoffPolicy.LINEAR,OneTimeWorkRequest.MIN_BACKOFF_MILLIS, TimeUnit.MILLISECONDS)//设置指数退避策略,例如当Worker线程的执行出现了异常,如服务器宕机,你希望一段时间后重试该任务 .setInputData(inputData)//传递数据给Worker .build(); WorkManager.getInstance(this).getWorkInfoByIdLiveData(oneTimeWorkRequest.getId()).observe(this, new Observer<WorkInfo>() {//获取WorkInfo对象,实时监测任务的状态 @Override public void onChanged(WorkInfo workInfo) { if(workInfo!=null&&workInfo.getState()==WorkInfo.State.SUCCEEDED){ String value = workInfo.getOutputData().getString("key");//获取Worker返回的数据 } } }); WorkManager.getInstance(this).enqueue(oneTimeWorkRequest);//将任务提交系统 } }

  4.将任务提交系统:WorkManager.getInstance(this).enqueue(oneTimeWorkRequest);

  5.观察任务的状态,任务提交系统后,可以通过WorkInfo获知任务的状态,有三种方式获取WorkInfo对象:

    (1)WorkManager.getWorkInfosByTag()

    (2)WorkManager.getWorkInfoById()

    (3)WorkManager.getWokInfosForUniqueWork()

    如果希望实时获取任务的状态,这三个方法还有对应的LiveData方法,在方法后面加上LiveData即可。

  6.WorkManager与Worker之间的参数传递

    WorkManager通过setInputData()方法向Worker传递数据,数据的传递通过Data对象来完成,需要注意的是,Data只能用于传递一些小的基本类型的数据。

    Worker通过getInputData()方法接收数据,并在任务完成后向WorkManager返回数据,通过return Result.success(outputData),然后WorkManager通过LiveData得到从Worker返回的数据。

  7.周期性任务PeriodicWorkRequest

    WorkRequest有两种实现方式,OneTimeWorkRequest和PeriodicWorkRequest,即一次性任务和周期性任务。周期性任务使用方式和一次性任务类似,不过需要注意的是,周期性任务的时间间隔不能少于15分钟。

    new PeriodicWorkRequest.Builder(Upload.class,15,TimeUnit.MINUTES).build();只需要做此修改,其他地方一样

  8.任务链

    如果有一系列的任务需要按顺序执行,那么可以利用WorkManager.beginWith().then().then()...enqueue();

WorkManager.getInstance(this)//先1后2
     .beginWith(firstWorkRequest) 
     .then(secondWorkRequest) 
     .enqueue(); 
or
WorkManager.getInstance(this)//先1和2;1和2不分先后,然后再3
    .beginWith(firstWorkRequest,secondWorkRequest) 
    .then(thirdWorkRequest) 
    .enqueue();

  

 

  

  


    

    

标签:Worker,用法,任务,Result,WorkManager,new,Data
From: https://www.cnblogs.com/luqman/p/WorkManager.html

相关文章

  • 问题解答:关于 SAP UI5 控制器(Controller) JavaScript 编码里单引号和双引号的用法澄
    笔者这篇教程文末,有朋友提问:SAPUI5应用开发教程之十-什么是SAPUI5应用的描述符文件manifest.json问题1:在index.html文件中body标签添加了代码:<divdata-sap-ui-componentdata-name="sap.ui5.walkthrough"data-id="container"data-settings='{"id":"wa......
  • SAP CDS view 里 UNION 操作的用法
    下图是SAPCDSviewUnion操作的语法和例子:SAPCDS(CoreDataServices)视图是SAPHANA数据库在ABAP层面上的抽象和逻辑视图。它不仅提供了一种SQL类型的语言(DataControlLanguage,DCL)来查询和操作数据,还提供了各种特性和功能以支持应用程序开发。在SAPCDS中,Union操......
  • SAP CDS view 的 having Condition 用法
    Havingcondition在groupby执行完毕后才evaludateSAPCDS(CoreDataServices)是一个用于定义和消费数据模型的基础设施。CDS提供了一种新的数据建模方式,它能够在数据库层定义复杂的视图,以提供更高效的数据访问。HAVING关键字在SQL中常常与GROUPBY关键字一起使用......
  • css计数器基本用法
    counter-reset定义计数器counter-increment定义计数器步长counter()/counters()使用计数器1.counter-resetcounter-reset:count11.1在同一层级中,重复使用counter-reset,可重新开始计数,与重置的含义吻合1.2多个计数器可在不同的层级配合使用1.3可......
  • Go中flag用法
    flag包实现了命令行标志解析。使用flag.String(),Bool(),Int()等定义标志。这声明了一个整数标志-n,存储在指针nFlag中,类型为*int:import"flag"varnFlag=flag.Int("n",1234,"helpmessageforflagn")如果您愿意,您可以使用Var()函数将标志绑定到一个变量。......
  • Java中Integer数据类型详细用法
    Java中的Integer类在对象中包装了一个基本类型int的值。以下是关于Integer类的详细用法和相关代码:1.构造方法:Integer(intvalue):构造一个新分配的Integer对象,它表示指定的int值。Integer(Strings):构造一个新分配的Integer对象,它表示String参数所指示的int值。javaCopycodeI......
  • 详述:whatever的用法
    whatever的用法具体表现如下:  1,whatever可以引导名词性从句,作为主语、宾语或表语,意思是“任何……都”、“无论什么……都”。例如:  Whateveryousayistrue.无论你说什么都是真的。Iwilldowhateveryouwant.我会做任何你想要的事。Heiswhatever......
  • sp_lock和sys.dm_tran_locks的用法
    09-sp_lock和sys.dm_tran_locks的用法 一、总结1.网址https://docs.microsoft.com/zh-cn/sql/relational-databases/system-stored-procedures/sp-lock-transact-sql?redirectedfrom=MSDN&view=sql-server-2017(sp_lock)https://docs.microsoft.com/zh-cn/sql/relational-dat......
  • Spring Cloud Alibaba Sentinel 用法
    SpringCloudAlibabaSentinel用法1、服务器雪崩在分布式系统中,由于网络原因或自身的原因,服务一般无法保证100%可用。如果一个服务出现了问题,调用这个服务就会出现线程阻塞的情况,此时若有大量的请求涌入,就会出现多条线程阻塞等待,进而导致服务瘫痪。由于服务与服务之间的依......
  • 不了解sys库也敢说Python行?sys模块这些用法你需要知道
    前言“不会用sys模块的Python程序员,和不会开车的司机一样令人捉急。”这句话一点没错,因为sys模块可以让你快速做到:解析命令行参数在运行Python程序时,我们可以在命令行中传递不同的参数,如果不用sys.argv来获取,你将很难处理程序输入。获取Python解释器信息要获取当前运行环境......