将对象从android ViewModel返回到回调函数的片段

时间:2018-12-16 16:18:01

标签: java android android-fragments callback android-viewmodel

我正在android中使用docker stats获取对象,然后将其传递给片段以更新UI组件。我试图异步获取对象的值,然后将对象从回调函数传递给片段。我在回调和异步任务中已经具有对象的非null值。我只是在通过调用片段Java代码中的函数来将对象发送到片段时遇到麻烦。这是代码段

ViewModel

的代码段

EventViewModel.java

ViewModel

我要将对象发送到的class EventViewModel extends AndroidViewModel { private OnEventListener mListener; Obj obj; //setting the listener public void registerOnEventListener(OnEventListener mListener){ this.mListener = mListener; } public void getObj(){ new Thread(new Runnable() { @Override public void run() { //code to obtain non-null value of object //& obtains non-null value here obj = some-non-null-value if(mListener != null){ //invoke the callback mListener.onEvent(); } } }); } interface OnEventListener(){ Obj onEvent(); } class A implements OnEventListener { @Override public Obj onEvent() { System.out.println(obj.property1); //obj is non-null here //.... return obj; } } } 的代码段

EventFragment.java

fragment

现在我知道我无法直接在public class EventFragment extends Fragment { private EventViewModel vm; @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); vm = ViewModelProviders.of(this).get(EventViewModel.class); EventViewModel.OnEventListener mListener = vm. new A(); vm.registerOnEventListener(mListener); vm.getObj(); Obj o = mListener.getEvent() //shows error as 'Incompatible Types' //so o is also null } } 方法中返回obj,它会在getObj()被赋予非空值之前(即异步任务结束之前)返回。在尝试上述方法时,obj中的对象o始终为null。因此,请告诉一种将对象发送到片段EventFragment的方法。请指出我是否需要发布更多代码。预先感谢。

1 个答案:

答案 0 :(得分:1)

使用LiveData

class EventViewModel extends AndroidViewModel {
  private MutableLiveData<Obj> liveObjects = new MutableLiveData<>();

  LiveData<Obj> getObjects() {
    return liveObjects;
  }

  public void loadObject(){
     new Thread(new Runnable() {
        @Override
        public void run() {
          Obj object = // TODO get the value

          liveObjects.postValue(object);
        }
      }).start();
  }
}

public class EventFragment extends Fragment {

 private EventViewModel vm;

 @Override
 public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    vm = ViewModelProviders.of(this).get(EventViewModel.class);

    vm.getObjects().observe(this, new Observer<Obj>() {
        @Override
        public void onChanged(@Nullable final Obj newValue) {
            // TODO something useful
        }
    });
}

然后在适当的时候在loadObject()上调用EventViewModel来触发后台工作和新对象的交付。