workstatus observer always in enqueued state

后端 未结 3 853
无人共我
无人共我 2021-01-20 05:54

I am trying to observe my workers but they are always in queued state or sometime it\'s RUNNING but never SUCCEED or

3条回答
  •  情书的邮戳
    2021-01-20 06:29

    This is for anyone who is having trouble getting their output data from periodic work. It's more like a hack. In your Worker, just define a static mutable Live Data. At the place where you observe your work's state, observe this live data when your state turns to "RUNNING".

    Here's a template :

    1. The actual Worker:
    public class SomeWorker extends Worker{
    
       //This live data can be of any type. I'm setting Boolean
       Public static MutableLiveData outputObservable = new MutableLiveData();
       private boolean output_boolean;
       try{
           //Do you work here post your result to the live data
           output_boolean = SomeTaskThatReturnsABoolean();
           outputObservable.postValue(output_boolean);
           return Result.Success();
       }catch(Exception e){
           e.printStackTrace();
           outputObservable.postValue(!output_boolean);
           return Result.Failure();
        }
    }
    
    
    1. Your activity that observes this worker's info:
    //In YourActivity class inside OnCreate
    mWorkManager.getWorkInfoForUniqueWorkLiveData(YOUR_TAG).observe (this,
       new Observer>(){
           @Override
           public void onChanged(@Nullable List workInfos) {
              if(workInfos!=null && (!(workInfos.isEmpty()))) {
                 WorkInfo info = workInfos.get(0);
                 switch(info.getState()){
                   case ENQUEUED:
                       break;
                   case RUNNING:
                       SomeWorker.outputObservable.observe(YourActivity.this,
                          new Observer(){
                          @Override
                           public void onChanged(@Nullable Boolean aBoolean) {
                               //EDIT: Remove the observer of the worker otherwise 
                               //before execution of your below code, the observation might switch
                               mWorkManager.getWorkInfoForUniqueWorkLiveData(YOUR_TAG).removeObservers(YourActivity.this);
                               if(aBoolean)
                                 //Do whatever you have to if it's true
                               else
                                 //Do whatever you have to if it's false
                               }
                          }
                       );
                 }
              }
           }
       }
    );
    

    In this way you can observe your results when the state of the work is under running, before it gets switched back to enqueued.

提交回复
热议问题