zoukankan      html  css  js  c++  java
  • 《Android进阶之光》--RxJava结合Retrofit访问网络

    1)配置

    dependencies{
        ...
        compile 'io.reactivex:rxjava:1.2.0'
        compile 'io.reactivex:rxandroid:1.2.1'
        compile 'com.squareup.retrofit2:retorfit:2.1.0'
        compile 'com.squareup.retrofit2:converter-gson:2.1.0'
        compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
    }

    2)修改请求网络接口

    Retrofit请求接口返回Call。若结合RxJava,则需要把Call改为Observable

    public interface IpServiceForPost{
        @FormUrlEncoded
        @POST("getIpInfo.php")
        Observable<IpModel> getIpMsg(@Field("ip") String first);
    }

    3)修改请求网络方法

    private void postIpInformation(String ip){
        String url = "http://ip.taobao.com/service/";
        Retrofit retrofit = new Retrofit.Builder().baseUrl(url).addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();
        IpServiceForPost ipService = retrofit.create(IpServcieForPost.class);
        subscription=ipService.getIpMsg(ip).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Subscriber<IpModel>(){
            @Override
            public void onCompleted(){
                Log.d(TAG,"onCompleted");
            }
            @Override
            public void onError(Throwable e){
                Log.d(TAG,"onError");
            }
            @Override
            public void onNext(IpModel ipModel){
                String country=ipModel.getData().getCountry();
                Toast.makeText(getApplicationContext(),country,Toast.LENGTH_SHORT).show();
            }
        });
    }

    4)请求返回数据格式封装

    public class IpModel{
        private int code;
        private IpData data;
        public void setCode(int code){
            this.code = code;
        }
        public int getCode(){
            return this.code;
        }
        ...
    }
    public class HttpResult<T>{
        private int code;
        private T data;
        public int getCode(){
            return code;
        }
        public void setCode(int code){
            this.code = code;
        }
        public T getData(){
            return data;
        }
        public void setData(T data){
            this.data = data;
        }
    }
    public interface IpServiceForPost{
        @FormUrlEncoded
        @POST("getIpInfo.php")
        Observable<HttpResult<IpData>> getIpMsg(@Field("ip") String first);
    }
    private void postIpInformation(String ip){
        ...
        subscription=ipService.getIpMsg(ip).subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<HttpResult<IpData>>(){
            @Override
            public void onCompleted(){
            }
            @Override
            public void onError(Throwable e){
            }
            @Override
            public void onNext(HttpResult<IpData> ipDataHttpResult){
                IpData data=ipDataHttpResult.getData();
                Toast.matkText(getApplicationContext(),data.getCountry(),Toast.LENGTH_SHORT).show();
            }
        });
    }

    5)取消请求

    @Override
    public void onStop(){
        super.onStop();
        if(subscription!=null && subscription.isUnsubscribed()){
            subscription.unsubscribe();
        }
    }
    private CompositeSubscription compositeSubscription = new CompositeSubscription();
    ...
    //发送请求的地方,将返回的subscription添加到compositeSubscription中
    compositeSubscription.add(subscription);
    ...
    //取消所有请求
    @Override
    public void onStop(){
        super.onStop();
        compositeSubscription.unsubscribe();
    }
  • 相关阅读:
    开发周记
    开发日记03
    开发日记01
    MVC实例应用
    MVC概述
    23种设计模式简述
    xx系统属性分析
    淘宝网质量属性
    架构漫谈阅读笔记
    浅谈软件架构师工作流程
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/8549088.html
Copyright © 2011-2022 走看看