为了账号安全,请及时绑定邮箱和手机立即绑定

观察变量的变化

观察变量的变化

牧羊人nacy 2021-04-01 13:11:03
我有一个在多个地方(一个用户)使用的变量。我不想每次打开片段或活动时获得该信息,而减少网络流量。我正在考虑的是一次获取此数据,然后在其他地方进行观察。我了解有诸如Observable和Eventbuses之类的东西,我研究了RxJava2,但似乎找不到找到更新Observable所持有价值的方法。你能告诉我我应该怎么做吗?我还想看看是否有一种方法可以每隔一段时间(例如,每1秒钟)重新更新一次数据。
查看完整描述

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()。


查看完整回答
反对 回复 2021-04-14
?
料青山看我应如是

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<3 LiveData)而崩溃

  • 在活动和片段之间共享资源的能力

为了进一步阅读,我建议您去这里


查看完整回答
反对 回复 2021-04-14
  • 2 回答
  • 0 关注
  • 174 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信