【发布时间】:2019-05-17 03:53:21
【问题描述】:
我在android中使用ViewModel来获取一个对象,然后将它传递给一个片段来更新UI组件。我试图异步获取对象的值,然后将对象从回调函数传递给片段。我在回调和异步任务中已经有了对象的非空值。我只是无法通过调用片段 java 代码中的函数将对象发送到片段。这是代码sn-p
ViewModel的代码sn-p
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 的代码 sn-p
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
}
}
现在我知道我不能在getObj() 方法中直接返回obj,它会在obj 被赋予非空值之前返回,即在异步任务结束之前。在尝试上述方法时,EventFragment 中的对象 o 始终保持为空。所以,请告诉一个将对象发送到片段EventFragment.java 的方法。如果我需要发布更多代码,请指出。提前致谢。
【问题讨论】:
-
为什么不让你的
ViewModel持有MutableLiveData<Obj>,拥有observe()的片段LiveData,然后从你的后台线程更新MutableLiveData? -
因为我试图获取对象的方法的返回类型为
Object,我无法将其转换为MutableLiveData<Obj> -
您不会“转换”它。您可以在
MutableLiveData<Obj>上调用postValue()来发布它。
标签: java android android-fragments callback android-viewmodel