将对象从 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()
以触发新对象的后台工作和交付。
我在 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()
以触发新对象的后台工作和交付。