Android 当前比较新的框架组合,Retrofit,OKHttp,RXJava的一些简单使用

来源:互联网 发布:网络传播杂志官网 编辑:程序博客网 时间:2024/05/16 15:54

这是我阶段性学习的结果,本文只是简单的使用,为深入研究,大神请绕路,有错误的地方,希望大家指正,首先了解下这三个框架都是什么

做个补充哈,由于retrofit2.0与先前版本的差别还是比较大,对于不同版本之间的差异在这里就不在进行详细区别。下面的例子也是针对于retrofit2.0进行介绍的。retrofit2.0它依赖于OkHttp,而且这部分也不再支持替换。在这里我们也不需要显示的导入okHttp,在retrofit中已经导入okhttp3。

1.OKHttp大家应该比较熟悉,看下面代码即可

    // 普通的get请求    private void get() {        //创建okHttpClient对象        OkHttpClient mOkHttpClient = new OkHttpClient();        //创建一个Request        final Request request = new Request.Builder()                .url("https://www.baidu.com/")                .build();        //new call        Call call = mOkHttpClient.newCall(request);        //请求加入调度        call.enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {            }            @Override            public void onResponse(Call call, Response response) throws IOException {                // 字符串                final String res = response.body().string();                // 二进制字节数组                response.body().bytes();                // 获取流文件,大文件下载                response.body().byteStream();                runOnUiThread(new Runnable() {                    @Override                    public void run() {                        // 更新UI界面                        mTv.setText(res);                    }                });            }        });        // 阻塞的方式        try {            Response response = call.execute();            // 字符串            String res = response.body().string();            // 二进制字节数组            response.body().bytes();            // 获取流文件,大文件下载            response.body().byteStream();        } catch (IOException e) {            e.printStackTrace();        }    }    // 普通的post请求    private void post() {        //创建okHttpClient对象        OkHttpClient mOkHttpClient = new OkHttpClient();        //创建一个Request        RequestBody requestBody;        FormBody builder = new FormBody.Builder().add("username","张鸿洋").build();        Request request = new Request.Builder()                .url("https://www.baidu.com/")                .post(builder)                .build();        mOkHttpClient.newCall(request).enqueue(new Callback(){            @Override            public void onFailure(Call call, IOException e) {            }            @Override            public void onResponse(Call call, Response response) throws IOException {            }        });    }

这个OKHttp跟大部分网络请求框架基本相同,这个框架支持String返回,可以配合GSON,FastJson等json解析,支持二进制返回,他还支持inputStream流文件返回,那么他一定可以下载大文件了,就到这里吧,等我整理好了OKHttp的封装,会放到上面来

2.Retrofit
先来拽一段English

Retrofitting refers to the addition of new technology or features to older systems.—From Wikipedia简单翻译一下,我这个半吊子英文不咋滴,见谅哈翻新(或者说升级)是指在旧系统中增加新技术或新特性看到这个翻新,大概就知道了,这个玩意是某某某的升级版

Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。注意这里并没有说它是网络请求框架,主要原因在于网络请求的工作并不是 Retrofit 来完成的。Retrofit 2.0 开始内置 OkHttp,前者专注于接口的封装,后者专注于网络请求的高效,啥意思呢,就这个意思,Retrofit 只负责封装,封装请求参数,URl什么的,有的兄弟就说了,那这玩意还得独自成一个类文件,多麻烦啊,别着急哈,我们慢慢往下看,一会我会结合着OKHttp一起玩

3.RXJava
这是个什么东西呢,有人说是异步,有人说是观察者模式,我个人比较倾向于观察者模式,话说异步我们有很多种方式去实现,Handler,线程, AsyncTask,这里针对RXJava做个代码

// 最简单的RXJava的使用public class RxJavaActivity extends Activity {    private ImageView mImageView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        Observable.just("")                .map(new Func1<String, Bitmap>() {                    @Override                    public Bitmap call(String s) {                        //可以在这里执行耗时操作,比如下载网络图片,然后转化为Bitmap                        //下载文件等等操作                        return null;                    }                }).subscribeOn(Schedulers.io())//把工作线程指定为了IO线程                .observeOn(AndroidSchedulers.mainThread())//把回调线程指定为了UI线程,至于怎么去的IO线程,又是怎么回到主线程的,只有看源码才能知道了                .subscribe(new Action1<Bitmap>() {                    @Override                    public void call(Bitmap bitmap) {                        //这里是在UI线程,这里显示了图片                        mImageView.setImageBitmap(bitmap);                    }                });    }}

如果各位兄弟想详细了解RXJava是什么,都能干什么,那就移步到百度吧,哪里有着详尽的解答,小弟才疏学浅,无法解答,呜呜呜




来来来,言归正传吧

// OKHttp的简单封装public class OKHttpUtil {    private static OkHttpClient mOkHttpClient;    /**     * 获取OkHttpClient对象     *     * @return     */    public static OkHttpClient getOkHttpClient() {        if (null == mOkHttpClient) {            //同样okhttp3后也使用build设计模式//            try {            try {                mOkHttpClient = new OkHttpClient.Builder()                        //添加拦截器                        .addInterceptor(new MyIntercepter())                        //设置请求读写的超时时间                        .connectTimeout(10 * 1000, TimeUnit.SECONDS)                        .writeTimeout(10 * 1000, TimeUnit.SECONDS)                        .readTimeout(10 * 1000, TimeUnit.SECONDS)                         .sslSocketFactory(new TLSSocketFactory())                        //                    .cache(cache)                        .build();            } catch (KeyManagementException e) {                e.printStackTrace();            } catch (NoSuchAlgorithmException e) {                e.printStackTrace();            }        }        return mOkHttpClient;    }    /**     * 拦截器     */    private static class MyIntercepter implements Interceptor {        @Override        public Response intercept(Chain chain) throws IOException {            Request oldRequest = chain.request();            //----------------以下代码为添加一些公共参数使用--------------------------            // 添加新的参数            Request request = oldRequest                    .newBuilder()//                    .addHeader("Version", 1000 + "")//                    .addHeader("Token", "")//                    .addHeader("DeviceKind", "2")//                    .addHeader("Content-Type", "application/json; charset=UTF-8")//                    .addHeader("Accept", "application/json; charset=UTF-8")                    .build();//            Response response = chain.proceed(request);            String requestUrl = request.url().toString(); // 获取请求url地址            String methodStr = request.method(); // 获取请求方式            RequestBody body = request.body(); // 获取请求body            String requestBodyStr = (body == null ? "null" : body.toString());            // 打印Request数据            Log.i("request", "requestUrl=====>" + requestUrl);            Log.i("request", "requestMethod=====>" + methodStr);            Log.i("request", "requestBody=====>" + body);            Log.i("request", "requestBodyStr=====>" + requestBodyStr);            return chain.proceed(request);        }    } }

可以加post,get,postUploadFIle,downLoadFile等等方法,当然,我是懒人,啥也没加,哈哈哈哈哈

假设我们有一个UserBean,我们现在想发起一个请求,首先我们需要参数的一些准备工作

public interface RetrofitService {    @POST("http://192.168.7.32:8080/appConsole/app/auth.do")    Observable<BaseResponseEntity<UserBean[]>> getLoginData(    );}

先弄个baseUrl,组合一下参数,发起对应请求,其实这个类就相当于是我们以前的service

public class RetrofitHttp {    public static final String BASE_URL = "https://pfizer.efrobot.com/android/";    private Retrofit retrofit;    private RetrofitService retrofitService ;    //构造方法私有    private RetrofitHttp () {        retrofit = new Retrofit.Builder()                .addConverterFactory(GsonConverterFactory.create())                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())                .client(OKHttpUtil.getOkHttpClient())                .baseUrl(BASE_URL)                .build();        RetrofitService = retrofitService .create(RetrofitService .class);    }    //在访问HttpMethods时创建单例    private static class SingletonHolder {        private static final HttpMethods INSTANCE = new HttpMethods();    }    //获取单例    public static RetrofitHttp getInstance() {        return SingletonHolder.INSTANCE;    }    /**     * 用于获取登录数据     */    public void getLoginData(Subscriber<UserBean[]> subscriber) {        Observable observable = apiService.getLoginData().map(new HttpResultFunc<UserBean[]>());        toSubscribe(observable, subscriber);    }    private <T> void toSubscribe(Observable<T> o, Subscriber<T> s) {        o.subscribeOn(Schedulers.io())                .unsubscribeOn(Schedulers.io())                .observeOn(AndroidSchedulers.mainThread())                .subscribe(s);    }}

我们来看一个具体的请求是什么样子的

HttpMethods.getInstance().getLoginData(new NoProgressSubscriber(new SubscriberOnNextListener<DownDataResponseBean[]>() {            @Override            public void onNext(DownDataResponseBean[] downDataResponseEntities) {            if (downDataResponseEntities != null && downDataResponseEntities.length > 0) {                // 解析数据,更新UI界面             } else {                //数据为空,做相应的处理             }            }        }, mContext));

注册监听的回调接口

// 注册监听接口public interface SubscriberOnNextListener<T> {    void onNext(T t);}

先写到这里吧,有时间回来继续补充,奥对了,附上AS的依赖

    // OKHttp3    compile 'com.squareup.okhttp3:okhttp:3.3.1'    // Retrofit2    compile 'com.squareup.retrofit2:retrofit:2.2.0'    compile 'com.squareup.retrofit2:retrofit-converters:2.2.0'    compile 'com.squareup.retrofit2:retrofit-adapters:2.2.0'    compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'

写完回顾了一下,发现,我组织语言的能力还是需要加强啊,大家凑合着看吧,只可意会不可言传

阅读全文
1 0