Android—-Rxjava与Retrofit初体验

RxJava(响应式编程):

在 GitHub 主页上的自我介绍是 “a library for composing asynchronous and event-based programs using observable sequences for the Java VM”(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。这就是 RxJava ,概括得非常精准。

Retrofit:

Retrofit与okhttp共同出自于Square公司,retrofit就是对okhttp做了一层封装。把网络请求都交给给了Okhttp,我们只需要通过简单的配置就能使用retrofit来进行网络请求了,其主要作者是Android大神JakeWharton。

下面是相关学习文档

RxJava:http://gank.io/post/560e15be2dca930e00da1083
Retrofit:https://square.github.io/retrofit/

1.在buil.gradle添加依赖

    compile 'io.reactivex:rxandroid:1.2.1'
    compile 'io.reactivex:rxjava:1.2.1'
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-scalars:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'

2.需要添加网络权限

<uses-permission android:name="android.permission.INTERNET" />

这里请求用到的网址:http://www.omghz.cn/FirstService/getString

3.先来说说RxJava(观察者模式):第一种形式

    // 创建字符串
    private String sayRxAndroid() {
        return "你好啊! RxAndroid";
    }

    //第一种
    private void numberOne() {
        //这里定义的Observable(被观察者,事件源)  对象仅仅发出一个Hello World字符串,然后就结束了。
        Observable<String> observable = Observable.create(
                new Observable.OnSubscribe<String>() {
                    @Override
                    public void call(Subscriber<? super String> sub) {
                        sub.onNext(sayRxAndroid());
                        sub.onCompleted();
                    }
                }
        );
        //接着我们创建一个Subscriber(观察者)来处理Observable对象发出的字符串。
        //只要订阅了observable,那么当他发生改变时这里就可以接收到消息
        Subscriber<String> subscriber = new Subscriber<String>() {
            @Override
            public void onNext(String s) {
                textView1.setText(s);
            }

            @Override
            public void onCompleted() {
            }

            @Override
            public void onError(Throwable e) {
                //出错回调
            }
        };
        //通过subscribe函数就可以将我们定义的observable对象和subscriber对象关联起来,
        // 这样就完成了subscriber对observable的订阅。
        observable.subscribe(subscriber);//订阅
    }

4.第二种形式,也就是对第一种形式的简化

//第二种,简单形式。Observable.just()就是用来创建只发出一个事件就结束的Observable对象
    private void numberTwo() {
        Observable<String> observable = Observable.just(sayRxAndroid() + "简单形式");
        //我们其实并不关心OnComplete和OnError,
        //我们只需要在onNext的时候做一些处理,这时候就可以使用Action1类。
        Action1<String> action1 = new Action1<String>() {
            @Override
            public void call(String s) {
                textView2.setText(s);
            }
        };
        //订阅
        observable.subscribe(action1);
    }

5.第三种形式,对第二种形式的简化

//方式二的代码最终可以简化成这样
    private void numberThree() {
        Observable.just(sayRxAndroid() + "简单形式二")
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        textView3.setText(s);
                    }
                });
    }

6.这里我没有引入Lambda表达式,Lambda表达式可以让上面的代码更加的简化、直观有兴趣的小伙伴可以尝试一下,下面我们使用RxJava来加载网络数据。

Schedulers(调度器)->线程控制
subscribeOn(Schedulers.io())—>指定 observable 发生在 IO 线程
observeOn(AndroidSchedulers.mainThread())—>指定 subscribe 的回调发生在主线程

 //请求网络数据,获取数据
    private void numberFour() {
        final Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext(getInternet());
                subscriber.onCompleted();
            }
        })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread());
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(final View v) {
                observable.subscribe(new Subscriber<String>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(String s) {
                        textView4.setText(s);
                    }
                });
            }
        });
    }

getInternet()从网络获取数据

private String getInternet() {
        StringBuilder sb = new StringBuilder();
        String line;
        BufferedReader reader;
        try {
            URL url = new URL("http://www.omghz.cn/FirstService/getString");
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod();
            urlConnection.setConnectTimeout(3000);
            urlConnection.setReadTimeout(3000);
            if (urlConnection.getResponseCode() == 200) {
                reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), ));
                while ((line = reader.readLine()) != null) {
                    sb.append(line);
                }
                return sb.toString();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

7.我们还可以来获取网络图片

    //从网络上获取一张图片
    private void numberFive() {
        Observable.just("http://sc.jb51.net/uploads/allimg/141119/10-1411192130010-L.jpg") // 输入类型 String
                .map(new Func1<String, Bitmap>() {
                    @Override
                    public Bitmap call(String url) { // 参数类型 String
                        return getBitmap(url); // 返回类型 Bitmap
                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<Bitmap>() {
                    @Override
                    public void call(Bitmap bitmap) {
                        showBitmap(bitmap);
                    }

                    //显示获取的图片
                    private void showBitmap(Bitmap bitmap) {
                        ImageView iv = (ImageView) findViewById(R.id.iv);
                        iv.setImageBitmap(bitmap);
                    }
                });
    }

从网络获取一张图片

private Bitmap getBitmap(String path) {
        try {
            URL url = new URL(path);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod();
            urlConnection.setConnectTimeout(3000);
            urlConnection.setReadTimeout(3000);
            if (urlConnection.getResponseCode() == 200) {
                InputStream inputStream = urlConnection.getInputStream();
                return BitmapFactory.decodeStream(inputStream);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

8.说了那么多RxJava,现在来看下RxJava与Retrofit结合请求网络,先来说说Retrofit的使用

Retrofit需要定义一个接口,用来返回我们的Call对象。
这里请求所使用的接口:http://www.omghz.cn/FirstService/getString

RequestServes.class

interface RequestServes {
    /**
     * 使用retrofit与Get方式获取网络数据
     *
     * @GET("getString")--->定义请求方式和请求地址==== Call<String>--->定义返回结果类型
     */
    @GET("getString")
    Call<String> getJson(@Query("username") String username, @Query("password") String password);
    //@Query("username") String username, @Query("password") String password
    //请求参数,括号内为键值名,参数为传递的值

    //使用retrofit与Post方式获取网络数据
    @POST("getString")
    Call<String> getStringRetrofit(@Query("username") String username, @Query("password") String password);

    //使用retrofit与RxJava与Post方式获取网络数据
    @POST("getString")
    Observable<String> getStringRxJava(@Query("username") String username, @Query("password") String password);

    //序列化 这里好像只能使用POST请求,GET请求会出错
    @POST("getString")
    Call<Result<UserInfo>> getGson(@Body UserInfo user);
}

9.接口写完了,我们来创建一个Retrofit对象使用Get请求网络

/**
  * 使用Retrofit与Get请求网络
  */
private void getJson() {
        Retrofit retrofit = new Retrofit.Builder()
                //http://www.omghz.cn/FirstService/getString
                .baseUrl("http://www.omghz.cn/FirstService/")
                //增加返回值为String的支持
                .addConverterFactory(ScalarsConverterFactory.create())
                .build();
        RequestServes serves = retrofit.create(RequestServes.class);//这里采用的是Java的动态代理模式
        Call<String> call = serves.getJson("名字", "密码");//传入我们请求的键值对的值
        call.enqueue(new Callback<String>() {
            @Override
            public void onResponse(Call<String> call, Response<String> response) {
                textView4.setText("Retrofit:--Get" + response.body());
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {

            }
        });
    }

10.使用Retrofit与Post请求网络

    /**
     * 使用Retrofit与Post请求网络
     */
    private void getStringRetrofit() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://www.omghz.cn/FirstService/")
                //增加返回值为String的支持
                .addConverterFactory(ScalarsConverterFactory.create())
                .build();
        RequestServes serves = retrofit.create(RequestServes.class);//这里采用的是Java的动态代理模式
        Call<String> call = serves.getStringRetrofit("阿钟", "1011");//传入我们请求的键值对的值
        call.enqueue(new Callback<String>() {
            @Override
            public void onResponse(Call<String> call, Response<String> response) {
                textView4.setText("Retrofit:--Post" + response.body());
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {

            }
        });

    }

11.使用Retrofit+RxJava与Post请求网络

    /**
     * 使用Retrofit+RxJava与Post请求网络
     */
    private void getStringRetrofitRxJava() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://www.omghz.cn/FirstService/")
                .addConverterFactory(ScalarsConverterFactory.create())
                //解决 Unable to create call adapter for rx.Observable<java.lang.String>
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
        retrofit.create(RequestServes.class)//这里采用的是Java的动态代理模式
                .getStringRxJava("阿钟", "1011")//传入我们请求的键值对的值
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<String>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(String s) {
                        textView4.setText("Retrofit+RxJava:--Post" + s);
                    }
                });
    }

12.使用Retrofit+Gson与Post请求网络数据

    /**
     * 使用Retrofit与Gson获取数据
     */
    private void getGson() {
        Gson gson = new GsonBuilder()
                //配置你的gson
                .setDateFormat("yyyy-MM-dd hh:mm:ss")
                .create();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://www.omghz.cn/FirstService/")
                //可以接收自定义的Gson,当然也可以不传
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
        RequestServes serves = retrofit.create(RequestServes.class);
        UserInfo info = new UserInfo();
        info.username = "阿钟";
        info.password = "1215";
        Call<Result<UserInfo>> call = serves.getGson(info);
        call.enqueue(new Callback<Result<UserInfo>>() {
            @Override
            public void onResponse(Call<Result<UserInfo>> call, Response<Result<UserInfo>> response) {
                //返回结果就是已经封装好的类,这两个类可以去源码看下比较简单就补贴出代码了
                Result<UserInfo> body = response.body();
                textView4.setText("Retrofit:--Post--Gson->" + "\ncode:" +
                        body.code + "\nmsg:" + body.msg + "\ndata:" + body.data.toString());
            }

            @Override
            public void onFailure(Call<Result<UserInfo>> call, Throwable t) {

            }
        });
    }

13.当你安装到手机上你会看到使用Retrofit+RxJava与Post请求网络 直接报如下错误

这里写图片描述

 解决方法:在build.gradle中添加compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'  
 在创建Retrofit 时添加 .addCallAdapterFactory()函数

 Retrofit retrofit = new Retrofit.Builder()
                .baseUrl()
                .addConverterFactory(ScalarsConverterFactory.create())

                //解决 Unable to create call adapter for rx.Observable<java.lang.String>
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();

效果图

这里写图片描述

到这里我们的第一次体验就结束了,对于Retrofit请求网络感觉真是太好用了省去了很多繁琐的步骤。这里好多用法都在代码注释中,所以小伙伴们阅读要仔细耐心哦!

项目地址:https://github.com/azhong1011/Rxjava-Retrofit

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Code-Porter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值