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

returning an object from an android ViewModel to the fragment from a callback function

我在 android 中使用 ViewModel 获取对象,然后将其传递给片段以更新 UI 组件。我试图异步获取对象的值,然后将对象从回调函数传递给片段。我在回调和异步任务中已经有对象的非空值。我只是无法通过调用片段 java 代码中的函数将对象发送到片段。这是代码片段

ViewModel

的代码片段

EventViewModel.java

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

 }
}

我要将对象发送到的 fragment 的代码片段

EventFragment.java

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

现在我知道我不能 return obj 直接在 getObj() 方法中,它在 obj 被赋予非-之前得到 returned空值,即在异步任务结束之前。在尝试上述方法时,EventFragment 中的对象 o 始终保持为 null。所以,请告诉一种将对象发送到片段 EventFragment.java 的方法。请指出我是否需要 post 更多代码。提前致谢。

使用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
        }
    });
}

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