gpt4 book ai didi

java - 从回调函数将对象从 android ViewModel 返回到 fragment

转载 作者:行者123 更新时间:2023-12-02 10:27:44 39 4
gpt4 key购买 nike

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

ViewModel的代码 fragment

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 的代码 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
}
}

现在我知道我不能在 getObj() 方法中直接返回 obj,它会在 obj 被赋予非-之前返回。 null 值,即异步任务结束之前。尝试上述方法时,EventFragment 中的对象 o 始终保持为 null。因此,请告诉我们一种将对象发送到 fragment EventFragment.java的方法。如果我需要发布更多代码,请指出。提前致谢。

最佳答案

使用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() 以触发后台工作并交付新对象。

关于java - 从回调函数将对象从 android ViewModel 返回到 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53804077/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com