我有一个在多个地方(一个用户)使用的变量。我不想每次打开片段或活动时都获得该信息,因此网络流量会减少。
我正在考虑的是一次获取这些数据,然后在其他地方进行观察。
我了解到有诸如Observables和Eventbuses之类的东西,我研究了RxJava2,但似乎找不到找到更新Observable所拥有值的方法。
你能告诉我我应该怎么做吗?我还想看看是否有一种方法可以每隔一段时间(例如,每1秒钟)重新更新数据。
答案 0 :(得分:1)
您可以按以下方式处理它:
您可以在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
}
);
}
}
}
然后,当您要从服务中检索用户时,在代码中(最好是ViewModel,使用MVVM),请执行以下操作:
DataRepository.getInstance().fetchUser().observe() {
....
}
当您只想使用以前获取的数据时,请执行以下操作:
DataRepository.getInstance().getUser().observe() {
....
}
请注意,您必须至少调用一次fetchUser()
方法,然后才能通过调用getUser()
获得用户数据。
答案 1 :(得分:1)
我认为您应该考虑将LiveData
与MVVM
体系结构一起使用。
简而言之,您将要做的事情是这样的:
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;
}
}
FirstFragment
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
}
}
DetailsFragment
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
具有生命周期意识,因此不再因活动生命周期而崩溃(ViewModel
<3 LiveData
)为进一步阅读,我建议您去here