我们写一个首字母为a的,后面加上字符串的案例:读这篇文章之前一定要读一下之前的Rxjava,Rxandroid的简介那篇文章:
package com.example.alan.play;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import rx.Observable;
import rx.Observer;
import rx.functions.Func1;
public class MainActivity extends AppCompatActivity {
String[] arr={"afdsa" , "bfdsa","cfda"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Observable<String> observable = Observable.from(arr);
// Func1,是一个自带的方法。这里的String 参数,就是我们arr的那个数组中的每一个元素。
// 因为他已经知道我们是String 类型的数组,所以,里面就是数组元素的类型。boolean的规则由我们来决定。
// 他将过滤之后的结果返回给filterResult.
Observable<String> filterResult = observable.filter(new Func1<String, Boolean>() {
@Override
public Boolean call(String s) {
return s.startsWith("a");
}
});
// 接着我们就简单的继续写我们的observer
Observer<String> observer = new Observer<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
String temp = s + "from Alpha";
System.out.println(temp.length());
}
};
// 接着就是把两个关联起来
filterResult.subscribe(observer);
}
void fun2(){
for(int i = 0;i < arr.length;i++){
String temp=arr[i];
if(temp.startsWith("a")){
temp+="from Alpha";
System.out.println(temp.length());
}
}
}
}
但是在这之中fun2没有用上,是我们为了演示,先写的一段java代码。
可以看到很流畅,先写被观察者,后写观察者,最后关联。基本的步骤。
tips:只是处理onnext事件的observer,我们可以用action方法替代。
综合java的语法,我们做了如下处理:
形成第二版的代码:
package com.example.alan.play;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import rx.Observable;
import rx.functions.Action1;
import rx.functions.Func1;
public class MainActivity extends AppCompatActivity {
String[] arr={"afdsa" , "bfdsa","cfda"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Observable
.from(arr)
.filter(new Func1<String, Boolean>() {
@Override
public Boolean call(String s) {
return s.startsWith("a");
}
}).subscribe(new Action1<String>() {
@Override
public void call(String s) {
String temp = s + "from Alpha";
System.out.println(temp.length());
}
});
}
}
发现代码量变得很少。(只有next方法的,我们可以用Action方法取代。)
接着,我们使用mapping取代filter。
package com.example.alan.play;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import rx.Observable;
import rx.functions.Action1;
import rx.functions.Func1;
public class MainActivity extends AppCompatActivity {
String[] arr={"afdsa" , "bfdsa","cfda"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Observable
.from(arr)
// 做数据转换的,用一个数据转换成另外一个数据。
.map(new Func1<String, String>() {
@Override
public String call(String s) {
return s + " from Alpha";
}
})
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
System.out.println(s.length());
}
});
}
}
上面两个代码反复写两遍,ok,那么可以自己写了。
我做了一个案例:如果button的内容是什么,我们改变,testview里面的东西
package com.example.alan.play;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Button;
import android.widget.TextView;
import butterknife.Bind;
import butterknife.ButterKnife;
import rx.Observable;
import rx.functions.Action1;
import rx.functions.Func1;
public class MainActivity extends AppCompatActivity {
@Bind(R.id.tv)
TextView tv;
@Bind(R.id.but)
Button but;
// 一个订阅器,一个呗观察对象
String[] arr={"afdsa" , "bfdsa","cfda"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
Observable.just(but.getText())
.filter(new Func1<CharSequence, Boolean>() {
@Override
public Boolean call(CharSequence charSequence) {
return charSequence.equals("组件");
}
})
.subscribe(new Action1<CharSequence>() {
@Override
public void call(CharSequence charSequence) {
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
tv.setText("我改变了"+charSequence);
}
});
}
}