Silk,一個基于java bean的輕量級響應式框架

xip448483 8年前發布 | 6K 次閱讀 Java Java開發

Silk

一個基于java bean的響應式框架

Why we need this?

假設我們有這么一個需求:

我們登陸成功之后通過服務器拿到一個useraccount對象,useraccount對象長這個樣子

public class UserAccount{
  private String userName;//姓名
  private int age;//年齡
  private String userImage;//頭像

public void setUserName(String userName){ this.userName = userName; }

public String getUserName(){ return userName; }

//后略...... }</code></pre>

我們會在界面上展示登陸用戶的姓名,頭像等等:

UserAccount useraccount = getUserAccount();//獲取到了useraccount對象
TextView tvName = findViewById(R.id.tv_name);
tvName.setText(useraccount.getUserName());

OK,接下來如果我們需要修改用戶的姓名,那么以往我們是這樣的:

useraccount.setUserName("mike");
//其他的工作
tvName.setText(useraccount.getUserName());
//其他的展示

這里面,我們一般是給對象set了某個值之后,再更新UI。

Now,We change

使用silk之后,現在我們的useraccount定義是這樣的:(就多了一個注解而已)

@RxBean
public class UserAccount{
  private String userName;//姓名
  private int age;//年齡
  private String userImage;//頭像

public void setUserName(String userName){ this.userName = userName; }

public String getUserName(){ return userName; }

//后略...... }</code></pre>

我們接下來這樣展示里面的數據:

TextView tvName = findViewById(R.id.tv_name);
SilkBrite<UserAccount> brite = SilkBrite.create();//初始化了一個brite
UserAccount useraccount = brite.asSilkBean(getUserAccount());//獲取useraccount對象,其實這是一個“換了包”的對象
brite.asModeObservable()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Action1<UserAccount>() {
                    @Override
                    public void call(UserAccount info) {
                        tvName.setText(useraccount.getUserName());
                    }
                });

然后我們要修改用戶姓名了!

//你只需要做下面這件事,UI上面就會同步
useraccount.setUserName("mike");

所以,用了silk,我們就不需要每次修改了bean之后還要去同步UI。

引用

  • gradle,在你的app的build.gradle文件中引入依賴
    dependencies {
      ...
      compile 'com.github.landscapeside:SilkLib:1.0'
      apt 'com.github.landscapeside:SilkComplier:0.1'
      ...
    }
    然后在你的app的build.gradle中應用apt插件:
    apply plugin: 'com.neenbedankt.android-apt'
    project的build.gradle中申明:
    dependencies {
          classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
      }
    用的是jitpack倉庫,所以需要在project的build.gradle中注明
    allprojects {
      repositories {
          jcenter()
          maven { url "https://jitpack.io" }
      }
    }

用法

  • 如上所說,在你需要silk功能的java bean類上使用RxBean注解,然后重新構建一下項目
  • 然后要新建一個SilkBrite出來 SilkBrite<UserAccount> brite = SilkBrite.create(); ,注意,目前來說,一個brite就對應處理一個bean對象
  • 接下來需要將原有的bean對象設置一個代理 UserAccount useraccount = brite.asSilkBean(getUserAccount());
  • 上一步生成的代理對象才能真正嵌入到Silk響應式框架之中,通過bean的setter即可觸發相應
  • 我們需要監聽到事件源發出的消息并作出反應
    brite.asModeObservable()
      .subscribeOn(Schedulers.io())
      .observeOn(AndroidSchedulers.mainThread())
      .subscribe(new Action1<UserAccount>() {
                      @Override
                      public void call(UserAccount info) {
                          tvName.setText(useraccount.getUserName());
                      }
                  });
  • 當然,還可以嵌套使用,比如一個Parent對象有2個Child,不管是修改Parent的屬性或者是child屬性,我們都希望能得到通知,則兩個類都標記上RxBean注解即可

    ```java

    @RxBean

    public class Parent{

    private String userName;//姓名

    private int age;//年齡

    private String userImage;//頭像

    private Child child1;

    private Child child2;

    public void setUserName(String userName){

    this.userName = userName;

    }

    public String getUserName(){

    return userName;

    }

    //后略......

    }

<p>@RxBean</p>

public class Child{

private String userName;//姓名

private int age;//年齡

//......

}

* 有時候我們有這樣的需求,顯示UserAccount的nick的時候希望能加上如果為空的默認顯示
```java
brite.asNodeObservable("nick")
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .map(o1 -> {
            String name = String.valueOf(o1);
            if (TextUtils.isEmpty(name)) {
                return "unknown user";
            }
            return name;
        })
        .subscribe(new Action1<String>() {
                @Override
                public void call(String name) {
                    tvName.setText(name);
                }
            });
  • 如果是要加上child的默認顯示
    brite.asNodeObservable("child1::userName")
          .subscribeOn(Schedulers.io())
          .observeOn(AndroidSchedulers.mainThread())
          .map(o1 -> {
              String name = String.valueOf(o1);
              if (TextUtils.isEmpty(name)) {
                  return "unknown user";
              }
              return name;
          })
          .subscribe(new Action1<String>() {
                  @Override
                  public void call(String name) {
                      tvName.setText(name);
                  }
              });

限制

  • 首先,一個brite就是用來處理一個bean對象,所以并不太適合列表類的應用,當然后續會考慮改進

  • 而且就如Silk的開發目的一樣,它就只是為了解決基于bean的響應式編程。

 

 

來自:http://www.jianshu.com/p/f4be589eb775

 

 本文由用戶 xip448483 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!