代码之家  ›  专栏  ›  技术社区  ›  Rasoul Miri

rx java obsever pojo模型的变化

  •  -4
  • Rasoul Miri  · 技术社区  · 6 年前

    见样品

    public class User {
         String firstName;
         String latsName;
    }
    

    public void main(){
        User user = new User();
        user.setFirstName("rasoul");
    
        //detect change by rxJava or Rx android
    
    }
    

    我需要使用rxjava来检测用户模型的变化

    2 回复  |  直到 6 年前
        1
  •  1
  •   EpicPandaForce    6 年前

    你需要让你的模型可以观察到变化。

    public class User {
         public interface ChangeListener {
             void onChanged(User user);
         }
    
         private List<ChangeListener> changeListeners = new CopyOnWriteArrayList<>();
    
         public void addChangeListener(ChangeListener listener) {
             this.changeListeners.add(listener);
         }
    
         public void removeChangeListener(ChangeListener listener) {
             this.changeListeners.remove(listener);
         }
    
         private String firstName;
         private String lastName;
    
         public void setFirstName(String firstName) {
             this.firstName = firstName;
             for(ChangeListener changeListener: changeListeners) {
                 changeListener.onChanged(this);
             }
         }
    }
    

    因为现在你可以观察一个用户:

    user.addChangeListener((u) -> {
        // user changed
    });
    

    现在你可以很容易地把它包装成可观察的:

    public class RxUser {
        private RxUser() {}
    
        public static Observable<User> observe(final User user) {
            return Observable.create((emitter) -> {
                  final User.ChangeListener changeListener = (user) -> {
                      emitter.onNext(user);
                  }
    
                  emitter.setDisposable(Disposables.fromAction(() -> { user.removeChangeListener(listener); }));
    
                  user.addChangeListener(listener);
            });
        }
    

    现在你可以做了

    User u = new User();
    Disposable disposable = RxUser.observe(u).subscribe((user) -> {
        // will be called for changes
    });
    
    u.setFirstName("hello");
    
        2
  •  1
  •   Blackbelt    6 年前

    一种方法是使用主题。你可以暴露潜在的 Observer Subject Subject.onNext ,所有订阅服务器都将收到更新的数据。

    你可以阅读更多关于 Subject 在这里