代码之家  ›  专栏  ›  技术社区  ›  Oscar Méndez

如何从工人阶级获得viewmodel?

  •  0
  • Oscar Méndez  · 技术社区  · 7 年前
    1. 我有一个 Activivity 在我的应用程序mainactivity中。
    2. mainActivity与 ViewModel 在oncreate方法中

      ...
      val someViewModel = ViewModelProviders.of(this).get(SomeViewModel::class.java)
      ...
      
    3. 我做一些背景工作 Workers .

      val someWork = OneTimeWorkRequestBuilder<LoginWorker>().build() WorkManager.getInstance().beginUniqueWork("SOMEWORK", ExistingWorkPolicy.REPLACE, captivePortalWork).enqueue()

    4. 问题来了…这个 worker 例如,做一个循环10次,每次只睡一秒钟…所以我们有10秒钟的背景工作。 我想更新 视图模型 显示后台工作的进度,每次都向上升级ui。

      a)我可以从mainActivity访问视图模型并观察 工人 但是我只能更新 视图模型 当进程成功或失败时…这意味着当工作完成0%或100%时,我可以显示进度。

      b)如果我可以从worker类访问viewmodel,我可以随时更新viewmodel。但我不知道怎么…此方法在工人类中不起作用。

      val someWork = ViewModelProviders.of(this).get(SomeViewModel::class.java)

      我怎么能得到一个 视图模型 从A Worker 班级?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Rahul    7 年前

    你不能使用 ViewModel 为此。您需要使用自己的房间数据库并公开 LiveData 显示进度。

        2
  •  2
  •   Choletski    6 年前

    你必须从 Worker 输出 Data ViewModel ,此数据在 Activity ,像这样:

    工人代码:

    public class MyWorker extends Worker {
    
        public static final String MY_KEY_DATA_FROM_WORKER = "MY_KEY_DATA_FROM_WORKER";
    
        public MyWorker(@NonNull Context appContext, @NonNull WorkerParameters workerParams) {
            super(appContext, workerParams);
        }
    
        @NonNull
        @Override
        public Worker.Result doWork() {
            //here do http or database requests
            String result = "my needed result";
    
            if (result != null) {
                setOutputData(new Data.Builder()
                        .putString(MY_KEY_DATA_FROM_WORKER, result)
                        .build());
    
                return Worker.Result.SUCCESS;
            }
    
            return Result.FAILURE;
        }
    }
    

    ViewModel的代码:

     public class MyActivityModel extends ViewModel {
    
        private final MutableLiveData<String> myLiveData = new MutableLiveData<String>();
    
        public void loadDataFromWorker(LifecycleOwner lifecycleOwner) {
            OneTimeWorkRequest myWorkerReq = new OneTimeWorkRequest.Builder(MyWorker.class)
                    .build();
    
            WorkManager mWorkManager = WorkManager.getInstance();
            mWorkManager
                    .beginWith(myWorkerReq)
                    .enqueue();
    
            mWorkManager.getStatusByIdLiveData(myWorkerReq.getId()).observe(lifecycleOwner, new Observer<WorkStatus>() {
                @Override
                public void onChanged(WorkStatus workStatus) {
                    if (workStatus.getState().isFinished()) {
    
                        // here you asign data to ViewModel
                        Data workOutputData = workStatus.getOutputData();
                        myLiveData.setValue(workOutputData.getString(MyWorker .MY_KEY_DATA_FROM_WORKER));
                    }
                }
            });
        }
    
        public MutableLiveData<String> getData() {
            return myLiveData;
        }
      }
    

    活动代码:

    //...
    
      @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_activity);
    
        //declare model and start loading data in Worker
        MyActivityModel model = ViewModelProviders.of(this).get(MyActivityModel.class);
        model.loadDataFromWorker(this);
    
        //observe data from model
        model.getData().observe(this, new Observer<String>() {
            @Override
            public void onChanged(String str) {
    
            //here you get new String value or null if Work failed 
    
            }
        });
    }
    
    //...
    
    推荐文章