我正在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
的方法。请指出我是否需要发布更多代码。预先感谢。
答案 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
来触发后台工作和新对象的交付。