2 回答
TA贡献1864条经验 获得超6个赞
您可以按以下方式处理:
您可以在一个Repository类中从网络中获取数据,并使该类成为单例。然后从服务中检索数据并将其发送到LiveData对象。现在,您可以观察到该LiveData对象以及从服务中分别检索数据的方法。因此,一旦检索到数据,便可以将其用于将来使用;如果要再次从服务中检索数据,则可以调用检索方法并进行观察。
类似于以下代码:
(注意:此代码仅是示例,由于我不了解您的模型,因此没有必要进行编译。)
DataRepository {
private static DataRepository instance;
private final LiveData<User> userLiveData;
private DataRepository() {}
public synchronized static DataRepository getInstance(){
synchronized (DataRepository.class) {
if(instance == null){
instance = new DataRepository();
instance.userLiveData = new MutableLiveData();
}
}
return instance;
}
public LiveData<User> getUser(){
return userLiveData;
}
public LiveData<User> fetchUser(){
callGetUserServiceAsync();
return userLiveData;
}
public void callGetUserServiceAsync(){
//call your service asynchronously and when service call back is called do as below, this call sample is in retrofit format, yours might be different
callService().enqueue( new CallBack<User>(){
@Override
public void onResponse(Call<IndraConfigure> call, Response<IndraConfigure> response) {
userLiveData.postValue(response.body); //assuming that response.body is of type User
}
@Override
public void onFailure(Call<IndraConfigure> call, Throwable t) {
// do something relevant when call fails to fetch user
}
);
}
}
}
然后,当您想从服务中检索用户时,在代码中(最好是使用MVVM的ViewModel),请执行以下操作:
DataRepository.getInstance().fetchUser().observe() {
....
}
当您只想使用以前获取的数据时,请执行以下操作:
DataRepository.getInstance().getUser().observe() {
....
}
请注意,您必须fetchUser()至少调用一次该方法,然后才能通过调用获得用户数据getUser()。
TA贡献1772条经验 获得超8个赞
我认为您应该考虑将其LiveData与MVVM体系结构一起使用。
TL; 博士
简而言之,您将要做的是这样的事情:
SharedSessionViewModel
public class SessionSharedViewModel extends ViewModel {
private LiveData<Session> sharedSession = new MutableLiveData()
public SessionSharedViewModel() {
super();
}
public void setSession(Session data) {
MutableLiveData<Session> casted = (MutableLiveData<Session>) this.sharedSession
casted.postValue(data)
}
public LiveData<Session> getSharedSession() {
return this.sharedSession;
}
}
第一片段
public class FirstFragment extends Fragment() {
private SessionSharedViewModel session;
// some sort of callback called when the user session arrives from the API
public void methodThatHandlesUserData(Session user){
session.getSharedSession().setSession(user);
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState)
session = ViewModelProviders.of(this.activity).get(SessionSharedViewModel.class)
session.sharedSession.observe({yourobservablehere});
Observer<Session> userObserver = new Observer<>(){
@Override
public void onChanged(Session user){observableCallback(user);}
};
sharedViewModel.sharedSession.observe(userObserver);
}
public void observableCallback(newSession: Session) {
// Do something when returning to this fragment
}
}
详细片段
class SessionDetailsFragment : Fragment() {
private SessionSharedViewModel sharedViewModel;
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState)
sharedViewModel = ViewModelProviders.of(this.activity).get(SessionSharedViewModel.class)
Observer<Session> userObserver = new Observer<>(){
@Override
public void onChanged(Session user){observableCallback(user);}
};
sharedViewModel.sharedSession.observe(userObserver);
}
public void observableCallback(newSession: Session) {
Toast.makeText(activity, "This is inside new activity: "+newSession.getUsername(), Toast.LENGTH_SHORT);
}
}
进一步阅读
LiveData
已被Android团队采用,它由的新androidx
库完全支持,构成的一部分Android Arquitechture Components
。
使用LiveData
提供了一组不错的良好功能,例如:
没有内存泄漏
您的应用的用户界面与数据状态相符
LiveData
知道生命周期,因此不会再因Activity生命周期(ViewModel
<3LiveData
)而崩溃在活动和片段之间共享资源的能力
为了进一步阅读,我建议您去这里
添加回答
举报