Retrofit2.0以及rxjava

最近接触了Retrofit这个网络框架,下面记录一些Retrofit的简单使用:

首先对build.gradle(app)进行一些配置:

    compile 'com.squareup.okhttp3:okhttp:3.2.0'
    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'

然后我们需要定义一个接口,用于回调

public interface WetherInfoService {
    @GET("http://v.juhe.cn/xiangji_weather/real_time_weather.php?areaid=101010100&key=384d62f725b7024281943a774ae96e5")
    Call<ResponseBody> getString();
}
Retrofit使用了大量的注解,进行下面的操作的时候我们不妨先来学习一下Retrofit中的注解


方法注解,包含@GET、@POST、@PUT、@DELETE、@PATH、@HEAD、@OPTIONS、@HTTP。
标记注解,包含@FormUrlEncoded、@Multipart、@Streaming。
参数注解,包含@Query,@QueryMap、@Body、@Field,@FieldMap、@Part,@PartMap。

其他注解,@Path、@Header,@Headers、@Url


@HTTP:可以替代其他方法的任意一种

@Url:使用全路径复写baseUrl,适用于非统一baseUrl的场景。

@Streaming:用于下载大文件

@Path:URL占位符,用于替换和动态更新,相应的参数必须使用相同的字符串被@Path进行注释

@Query,@QueryMap:查询参数,用于GET查询,需要注意的是@QueryMap可以约定是否需要encode

@Body:用于POST请求体,将实例对象根据转换方式转换为对应的json字符串参数,
这个转化方式是GsonConverterFactory定义的。

@Field,@FieldMap:Post方式传递简单的键值对,
需要添加@FormUrlEncoded表示表单提交

@Part,@PartMap:用于POST文件上传
其中@Part MultipartBody.Part代表文件,@Part("key") RequestBody代表参数

@Header:header处理,不能被互相覆盖,用于修饰参数,

下面给出主Activity,主要的功能是单击按钮的时候就会向服务器发出请求然后将请求得到的数据通过textview显示,按钮1直接请求向服务器请求Gson数据,按钮2进一步将请求得到的Gson数据进行了解析~

public class MainActivity extends AppCompatActivity {

    @BindView(R.id.button)
    Button button;
    @BindView(R.id.textView)
    TextView textView;
    private static final String BASE_URL = "http://v.juhe.cn/";
    @BindView(R.id.button2)
    Button button2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
    }

    @OnClick({R.id.button,R.id.button2})
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.button:
                Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).build();
                WetherInfoService wetherInfoService = retrofit.create(WetherInfoService.class);
                Call<ResponseBody> call = wetherInfoService.getString();
                call.enqueue(new Callback<ResponseBody>() {
                    @Override
                    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                        try
                        {
                            textView.setText(response.body().string());
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void onFailure(Call<ResponseBody> call, Throwable t) {
                        textView.setText(t.getMessage());
                    }
                });
                break;
            case R.id.button2:
                final Gson gson = new GsonBuilder().create();
                Retrofit retrofit2 = new Retrofit.Builder()
                        .baseUrl(BASE_URL)
                        .addConverterFactory(GsonConverterFactory.create(gson))
                        .build();
                WetherInfoService weatherInfoService = retrofit2.create(WetherInfoService.class);
                Call<WeatherInfo> call2 = weatherInfoService.getweatherInfo();

                call2.enqueue(new Callback<WeatherInfo>() {
                    @Override
                    public void onResponse(Call<WeatherInfo> call, Response<WeatherInfo> response) {
                        WeatherInfo info = response.body();
                        Log.i("TAG",gson.toJson(info));
                        textView.setText(gson.toJson(info));
                    }

                    @Override
                    public void onFailure(Call<WeatherInfo> call, Throwable t) {
                        textView.setText("error"+t.getMessage());
                    }
                });
                break;
        }

    }
}

下面给出接口的代码:

public interface WetherInfoService {
    @GET("http://v.juhe.cn/weather/index?format=2&cityname=%E8%8B%8F%E5%B7%9E&key=fe8ef965373cd852b6f91e67fee1b079")
    Call<ResponseBody> getString();
    @GET("http://v.juhe.cn/weather/index?format=2&cityname=%E8%8B%8F%E5%B7%9E&key=fe8ef965373cd852b6f91e67fee1b079")
    Call<WeatherInfo> getweatherInfo();
}
到这边基本上就完成一个利用retrofit2框架完成一个网络请求的简单Demo,下面我们将这个Demo写成RX格式的难过...
仔细体会一下其中的不同
第一步.我们需要引入对RXJAVA的一些依赖:

    compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'
    compile 'io.reactivex:rxandroid:1.1.0'
    compile 'io.reactivex:rxjava:1.1.0'

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
    }
    @OnClick({R.id.button,R.id.button2})
    public void onClick(View view)
    {

        switch (view.getId())
        {
            case R.id.button:
                Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).
                addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();
                WetherInfoService wetherInfoService = retrofit.create(WetherInfoService.class);
                Subscription subscription=wetherInfoService.getString().subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<Response<ResponseBody>>(){
                            @Override
                            public void onCompleted() {
                                Log.e("TAG","成功");
                            }
                            @Override
                            public void onError(Throwable e) {
                                    Log.e("TAG","有毒!");
                            }
                            @Override
                            public void onNext(Response<ResponseBody> response) {
                                try {
                                    textView.setText(response.body().string());
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                            }
                        });
               /* addSubscription(subscription);*/
                break;
            case R.id.button2:
                break;
        }
    }
}
接口定义有有所改动:

public interface WetherInfoService {
    @GET("http://v.juhe.cn/xiangji_weather/real_time_weather.php?areaid=101010100&key=3d84d62f725b7024281943a774ae96e5")
    Observable<Response<ResponseBody>> getString();//使用rx格式的接口定义
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值