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

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

做个补充哈,由于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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值