RxJava
异步操作库 观察者模式
优点 简洁
实现步骤:
1创建观察者Observer(Subscriber)////observer会被转换成subscriber; 区别subscriberti提供更多方法,如:onStart() unsubscribe()
Observer
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Toast.makeText(MainActivity.this,s,Toast.LENGTH_LONG).show();
}};
2 创建被观察者 Observable
Observable
@Override
public void call(Subscriber subscriber) {
subscriber.onNext("helloRx");
}});
还有just() from()来构建被观察者
3 订阅 Subscribe
Observable.subscribe(observer);
4 线程控制 Scheduler(调度器)
1) Schedulers.immediate() 直接在当前线程运行,这是默认的
2) Schedulers.newThread() 总是启用新线程,并在新线程运行
3) Schedulesr.io() 操作(读写文件 数据库, 网络操作)相比newThread(),有更多的优化
4) Schedulers.computation() cpu密集型计算应当使用的线程
5) AndroidSchedurs.mainThread() 指的是操作将在UI线程执行
用subscribeOn() 和 observeOn()对线程控制
subscribeOn(): 事件产生的线程
observeOn() 事件消费的线程
5变换
1) map() 一对一的转化
2) flatMap() 一对多的转化
Retrofit
1 定义接口
public interfaceGitHubService {
String ENDPOINT ="https://api.github.com";
// 获取库, 获取的是数组
@GET("/users/{user}/repos")
Observable
}
2
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(GitHubService.ENDPOINT)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create()) // 添加Rx适配器
.addConverterFactory(GsonConverterFactory.create()) // 添加Gson转换器
.build();
3
GitHubService mGitHubService=retrofit.create(GitHubService.class);
4
mGitHubService.getRepoData("SpikeKing")
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(newObserver
Dagger 2(依赖注入框架)
@Inject 用途是注入。通常在需要的地方使用这个注解,换句话说,这个注解告诉dagger这个类或字段需要依赖注入。
@Module 注解Module类,这个类用来提供依赖。
@Provide 在module类中,我们定义的方法用这个来注解。方法名一般为provide+返回类型。(dagger在注入时调用该方法)
@Component 是连接@Inject和@Module的桥梁。用来注解的是接口,编译时dagger 用apt生成相应实现,名字一般为Dagger+类名。
@Scope dagger2通过自定义注解限定注解作用域。
@Qualifier 当类的类型不足以鉴别一个依赖时,我们用这个注解来标示。
一般使用
1) 写Module类
2) 写Component接口,接口有void inject() 。如void inject(MainActivitymainActivity);
3) 实现注入
@Inject//注入
MainPresenter mMainPresenter;
…
component=DaggerMainActivityComponent.builder()
.mainActivityModule(new MainActivityModule(this))
.build(); //初始化
component.inject(this);//应用
(除了用@Inject注入外,还可以调用component的方法获取依赖,但是要在Component的接口里,实现相应方法如OkHttpClient getOkHttpClient();然后可以通过调用component.getOkHttpClient();获取依赖 )
只有在获取依赖时才会调用Module的provide方法。初始化时并不会。
这三个框架是基友听说一起用会更好(dagger2 + RxJava +Retrofit)
退出应用的方式(按home后返回有bug)
1 设置第一个activity 的启动模式为singletask
2 重写这个activity 的onnewintent;方法内得到intent 并作相应判断 并finish 自己
3 在要退出的的地方 启动设置为第一个的activity;