非常火的retrofit+Rxjava浅析
来源:互联网 发布:我的世界pe拔刀剑js 编辑:程序博客网 时间:2024/05/22 17:36
最开始接触Android的时候使用的是 android-async-http,后来转战到了volley,最后发现retrofit+Rxjava实在火的不行,所以就开始接触这个框架。因为本人在刚开始学习这一块的时候没有头绪,网上找的感觉有点乱,对于新手的话可能看着会有写懵逼,所以在这里分享一下自己摸索的比较清晰的思路。
这里我就不说了单纯的retrofit了,又不懂的可以google一下,应该能理解。
1.这里直接在网上找了个网站https://api.douban.com/v2/movie/top250?start=10&count=11
导包:compile 'io.reactivex:rxjava:1.2.2'
compile 'io.reactivex:rxandroid:1.2.1'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.0'
添加网络权限<uses-permission android:name="android.permission.INTERNET" />
未封装:
1.新建一个接口IRequestParams ,这里主要放置的是请求方式和请求参数和请求url?前的一段(开发过程中url会有一部分不一样,就可以放在这里进行区分。
比如:https://api.douban.com/v2/movie/top250?和https://api.douban.com/v2/movie/top205?)
`public interface IRequestParams { @GET("top250") Observable<DateBean> getInfo(@Query("start") int start, @Query("count") int count);}
2.
package com.test.user.retrofit20.test;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import com.test.user.retrofit20.R;import retrofit2.Retrofit;import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;import retrofit2.converter.gson.GsonConverterFactory;import rx.Observable;import rx.Subscriber;import rx.android.schedulers.AndroidSchedulers;import rx.schedulers.Schedulers;public class InfoActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_info); //这里对retrofit进行初始化 创建一个gson转换工厂,RxJava也是用的call,不过它对call进行了优化, //通过map将response转换为自定义的Result的response,然后在请求成功后得到框架返回给我们的observable //然后就可以在onnext中进行操作 Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.douban.com/v2/movie/") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); //创建一个接口 IRequestParams iRequestParams = retrofit.create(IRequestParams.class); //通过接口中的方法,得到 Observable<DateBean> 即被观察者对象 Observable<DateBean> observable = iRequestParams.getInfo(0,10); //将主线程作为观察者,然后进行观察者雨被观察者的订阅 observable.subscribeOn(Schedulers.io()) .unsubscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<DateBean>() { @Override public void onCompleted() { Log.e("tag", "onCompleted"); } @Override public void onError(Throwable e) { Log.e("tag", "onError" + e.getMessage()+"--"+e.getLocalizedMessage()); } @Override public void onNext(DateBean dateBean) { Log.e("tag", "onNext"); } }); }}
注解:rxjava这里用到的是观察者模式,以上的注释是个人的理解,如果有错误的希望大神们可以评论指导下(蟹蟹啦)
这就是为封装的retrofit+rxjava 是不是已经着急尝试了呢,别着急下面还有更好的呢–
简单封装
1.IRequestParams这个接口不用修改
2.新建一个类,里面对网络的请求进行封装
package com.test.user.retrofit20.test;import java.util.concurrent.TimeUnit;import okhttp3.OkHttpClient;import retrofit2.Retrofit;import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;import retrofit2.converter.gson.GsonConverterFactory;import rx.Observable;import rx.Subscriber;import rx.android.schedulers.AndroidSchedulers;import rx.schedulers.Schedulers;public class HttpMethod { private static final String URL = "https://api.douban.com/v2/movie/"; private static final int DEFALUT_TIME = 30; private Retrofit retrofit; private IRequestParams requestParams; private static HttpMethod httpMethod = null; public HttpMethod() { OkHttpClient.Builder client = new OkHttpClient.Builder(); client.connectTimeout(DEFALUT_TIME, TimeUnit.SECONDS); retrofit = new Retrofit.Builder() .client(client.build()) .baseUrl(URL) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); requestParams = retrofit.create(IRequestParams.class); } public static HttpMethod getInstance() { if (httpMethod == null) { synchronized (HttpMethod.class) { if (httpMethod == null) { httpMethod = new HttpMethod(); } } } return httpMethod; } public <T> void toSubscriber(Observable<T> observable, Subscriber<T> subscriber) { observable.subscribeOn(Schedulers.io()) .unsubscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(subscriber); } public Observable<DateBean> getTopMovie(int start, int count) { Observable<DateBean> observable = requestParams.getInfo(start, count); return observable; }}
InfoActivity.class 修改如下
package com.test.user.retrofit20.test;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import com.test.user.retrofit20.R;import rx.Observable;import rx.Subscriber;public class InfoActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_info); Subscriber<DateBean> subscriber = new Subscriber<DateBean>() { @Override public void onCompleted() { Log.e("tag", "onCompleted"); } @Override public void onError(Throwable e) { Log.e("tag", "onError" + e.getMessage() + "--" + e.getLocalizedMessage()); } @Override public void onNext(DateBean dateBean) { Log.e("tag", "onNext"); } }; Observable<DateBean> observable = HttpMethod.getInstance().getTopMovie(10, 11); HttpMethod.getInstance().toSubscriber(observable, subscriber); }}
怎么样,是不是简洁了很多,刚学的新框架暂时也就封装到这一步了,有大神们可以帮忙继续封装下。以后如果学习到了更好的,也会和大家分享的。
最后 这一篇博客是我半懂情况下写的,注释可能理解的有问题,但是代码绝对没问题,都是测试过的。希望对想上手学习retrofit和rxjava的小伙伴有一点帮助.
- 非常火的retrofit+Rxjava浅析
- Retrofit+Rxjava的封装
- Retrofit+RxJava的使用
- 简单的RxJava+Retrofit
- Retrofit+RXJava的使用
- RxJava与Retrofit的封装
- MVP+Retrofit+RxJava的demo
- Retrofit+Rxjava的完美结合
- RxJava和Retrofit的介绍
- RxJava+Retrofit的Android开发
- Rxjava+Retrofit+Realm的天气预报
- Retrofit + RxJava 的结合使用
- Retrofit + RxJava的配合使用
- RXJava+retrofit的使用尝试
- Retrofit+RxJava的联合使用
- Retrofit+RxJava的联合使用
- RxJava+Retrofit+MVVM的封装
- MVP+Rxjava+Retrofit的使用
- 分布式数据收集:(Flume原理与应用)
- 测试
- out.flush(); out.close()问题
- Linux进程管理之“四大名捕”
- abbyy在使用时提示更改分辨率如何处理
- 非常火的retrofit+Rxjava浅析
- java编程思想之一切都是对象
- 吸血鬼数字
- linux内核分析——CFS(完全公平调度算法)
- Linux 系统结构详解
- oracle 基础操作
- public,private,protected,和默认的区别
- 代码+图文讲解spark中scala常用正则匹配
- Navicat for MySQL使用手记(下)--实现自动备份数据库