观察变量的变化

时间:2019-01-05 13:06:52

标签: java android rx-java2

我有一个在多个地方(一个用户)使用的变量。我不想每次打开片段或活动时都获得该信息,因此网络流量会减少。

我正在考虑的是一次获取这些数据,然后在其他地方进行观察。

我了解到有诸如Observables和Eventbuses之类的东西,我研究了RxJava2,但似乎找不到找到更新Observable所拥有值的方法。

你能告诉我我应该怎么做吗?我还想看看是否有一种方法可以每隔一段时间(例如,每1秒钟)重新更新数据。

2 个答案:

答案 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)

我认为您应该考虑将LiveDataMVVM体系结构一起使用。

TL; DR

简而言之,您将要做的事情是这样的:

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