安卓开发:Retrofit和Rxjava 优雅地实现网络请求

大家开发过程中或多或少都会用上网络请求,写法也各有千秋,下面我来介绍一下使用Retrofit和Rxjava来优雅地实现网络请求,关于Retrofit和Rxjava的介绍我就不多说了,毕竟研究的不深,大家可以看看其他大牛的博客,下面直接进入主题。
代码特点:代码简洁,方便管理

1、添加依赖

 // Android 支持 Rxjava
// 此处一定要注意使用RxJava2的版本
    compile 'io.reactivex.rxjava2:rxjava:2.1.11'
    compile 'io.reactivex.rxjava2:rxandroid:2.0.2'

// Android 支持 Retrofit
    compile 'com.squareup.retrofit2:retrofit:2.3.0'

// 衔接 Retrofit & RxJava
// 此处一定要注意使用RxJava2的版本
    compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'

// 支持Gson解析
    compile 'com.squareup.retrofit2:converter-gson:2.3.0'
    compile 'com.squareup.retrofit2:converter-scalars:2.0.2'
 //支持butterknife
    compile 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

2、添加权限

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

3、定义一个接口来进行网络请求和数据返回

public interface GetRequestInterface {
    // 网络请求
    @GET("query?")
    Observable<Translation1> getCallIntent(@Query("subject") String subject ,
                                           @Query("model") String model,
                                           @Query("key") String key,
                                           @Query("testType") String testType );
}

4、json返回示例

{
    "error_code": 0,
    "reason": "ok",
    "result": [
        {
            "id": 12,
            "question": "这个标志是何含义?",//问题
            "answer": "4",//答案
            "item1": "前方40米减速",//选项,当内容为空时表示判断题正确选项
            "item2": "最低时速40公里",//选项,当内容为空时表示判断题错误选项
            "item3": "限制40吨轴重",
            "item4": "限制最高时速40公里",
            "explains": "限制最高时速40公里:表示该标志至前方限制速度标志的路段内,机动车行驶速度不得超过标志所示数值。此标志设在需要限制车辆速度的路段的起点。以图为例:限制行驶时速不得超过40公里。",//答案解释
            "url": "http://images.juheapi.com/jztk/c1c2subject1/12.jpg"//图片url
        }
    ]
}

5、定义一个数据类Translation1


public class Translation1 {
    private String error_code;
    private String reason;
    private result[] result;
    private static class result {
        private String id;
        private String question;
        private String answer;
        private String item1;
        private String item3;
        private String item2;
        private String item4;
        private String explains;
        private String url;
    }

    //定义 输出返回数据 的方法
    public void show() {

        Log.d("RxJava",  reason);

    }
    public String getResult(){
        return result[0].id+"\n"+result[0].question+"\n"+result[0].answer;
    }
}

6、mainActivity(注意看注释)


public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    @BindView(R.id.hello)
    Button hello;
    @BindView(R.id.httpText)
    TextView httpText;
    Observable<Translation1> observable1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        hello.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 步骤1:创建Retrofit对象
                Retrofit retrofit = new Retrofit.Builder()
                        .baseUrl("http://v.juhe.cn/jztk/") // 设置  Url
                        .addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析(记得加入依赖)
                        .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // 设置支持RxJava
                        .build();

                // 步骤2:创建 网络请求接口 的实例
                GetRequestInterface request = retrofit.create(GetRequestInterface.class);

                // 步骤3:采用Observable<...>形式 对 2个网络请求 进行封装
                observable1 = request.getCallIntent("1","c1","key","rand");
                //observable1 = request.getCall();

                observable1.subscribeOn(Schedulers.io())               // (初始被观察者)切换到IO线程进行网络请求1
                        .observeOn(AndroidSchedulers.mainThread())  // (新观察者)切换到主线程 处理网络请求1的结果
                        .subscribe(new Consumer<Translation1>() {
                            @Override
                            public void accept(Translation1 translation1) throws Exception {
                                httpText.setText(translation1.getResult());//显示文本
                            }
                        }, new Consumer<Throwable>() {
                            @Override
                            public void accept(Throwable throwable) throws Exception {
                                Log.d(TAG, "accept: "+"请求失败");
                            }
                        });
            }
        });
    }
}

7’、效果图
这里写图片描述

不足自出,敬请指出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值