初学 retrofit2与RXJava 的搭配使用

来源:互联网 发布:如何和淘宝达人合作 编辑:程序博客网 时间:2024/04/30 04:30

retrofit2和RXJava 很早以前就有了 但是一直没事件学习 趁着前几天有空就学习了下
很难在网上找到完整的 retrofit2与RXJava 的搭配使用的例子 我自己也折腾半天才搞明白
首先我是在网上查看别人给出的文章试着实现我自己的登陆功能
http://blog.csdn.net/lmj623565791/article/details/51304204

下面说说具体实现方法吧
1. 导入依赖库

// rxjava 部分compile 'io.reactivex:rxandroid:1.1.0'// Because RxAndroid releases are few and far between, it is recommended you also// explicitly depend on RxJava's latest version for bug fixes and new features.    compile 'io.reactivex:rxjava:1.1.0'// retrofit 部分compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'

2.创建retrofit的请求接口类 我此处实现的是登陆功能

public interface LoginApi {    @POST("login")    @FormUrlEncoded    Observable<JSONObject> login(@Field("UserName") String username,       @Field("PassWord") String pwd);}

@post(“login”) 表示的是接口的最后一个动作 比如我的登陆接口的完整url为http://192.168.0.10:8080/api/mobileapp/login
那么@post()里就应该填写login 这个@post 代表的请求方式为post 也可以是get 但是一般请求都用post 关于get 上面的连接里也给出的调用方法了
大家注意返回的类型 由于我使用的是 rxjava 所以此处我返回的是 一个为JSONObject的被观察者对象 返回的类型可以是GSON等 不过我此处只需要判断登陆是否成功没必要做字段的映射我就返回了JSONObject对象类型 被观察者我理解为 执行任务的人 意思就是 用它来执行一个任务 如数据的获取 变换 计算等

3.调用retrofit接口实现登陆功能
我在activity里的调用代码为
由于是使用 rxjava
所以我首先定义了一个登陆观察者 观察者我理解为 获取结果的人
再定义一个 我们刚才编写好的登陆接口
private Observer login;
private LoginApi api;

// 在合适的地方初始化这个观察者和初始化登陆接口 如我在initData方法中初始化了它 这里面将是登陆结构的返回结果 相当与登陆结果的回掉login = new Observer<JSONObject>() {            @Override            public void onCompleted() {                Log.e("--------","onCompleted");            }            @Override            public void onError(Throwable e) {                Log.e("--------",e.toString());            }            @Override            public void onNext(JSONObject o) {                try {                    if (o.getBoolean("Success")) {                        Toast.makeText(LoginActivity.this,"登陆成功",Toast.LENGTH_LONG).show();                    } else {                        Log.e("---------",o.toString());                        Toast.makeText(LoginActivity.this,"登陆失败",Toast.LENGTH_LONG).show();                    }                } catch (JSONException e) {                    e.printStackTrace();                }            }        };// 初始化登陆接口Retrofit retrofit = new Retrofit.Builder()                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())                .addConverterFactory(JsonConverterFactory.create())                .baseUrl("http://192.168.0.10:8088/api/mobileapp/login/")                .build();        api = retrofit.create(LoginApi.class);

baseUrl里面可以是完整的url路径 如http://192.168.0.10:8088/api/mobileapp/login/ 那么接口中的@post(“”) 引号中的值将不被生效
addConverterFactory(JsonConverterFactory.create()) 由于我接口返回的结果为JSONObject对象所以我需要设置返回的类型 JsonConverterFactory.create() 次方法我是在网上找的 如果你也想返回JSONObject对象 那么你需要把这几个类放入你的工程
https://github.com/brokge/Retrofit2.0-JSONCoverter/tree/master/Retrofit%202-beta4 此目录下的类

点击按钮实现登陆

btLogin.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {       api.login("lhj","1234").subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).subscribe(login);            }        });

subscribeOn 表示的是 事件执行在什么线程里 由于登陆时网络请求 我让他执行在了 一个新的线程中
observeOn 我理解为结果数据返回在什么线程中 我此处返回的在android的主线程中 返回在主线程中通过对登陆结果进行分析就能对ui进行操作

好了 按照此种格式 现在你就能写出任意的网络请求了
本文章只写出了 post请求的构造方法
其它类型的请求 如文件上传 get 等 http://blog.csdn.net/lmj623565791/article/details/51304204 这个连接中以给出对应的方法

现在想来retrodfit和rxjava 也没那么难吧 文章中有不对的地方请指出 本人也是新手 不要喷

0 0
原创粉丝点击