Android Retrofit+rxjava+okhttp请求网络的基本用法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33451004/article/details/52496644

Android中当我们将界面写完后接下来的事情是什么? 当时是从服务器拉取数据,再给控件适配数据了;但是,请求的网络的框架一大堆,本人用过xUils,volley,HttpURLClient,Okhttp,okhttpUtils,现在在用retroift网络请求框架,个人觉得这个还是很牛逼的, 因为okhttp已经很厉害了, 而这个是对ok的再次升级;废话不多上,直接撸代码!!!

  1. 添加依赖(eclipse用户就不要围观了,洗洗碎)
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
    compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
    compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta2'
    compile 'io.reactivex:rxjava:1.1.0'
    compile 'io.reactivex:rxandroid:1.1.0'

2.定义请求接口

public interface NetService{

   @GET("weather")
    Call<Weather> loadeather(@Query("cityname") String cityname,@Query("key") String apiKey);


    @GET("weather")
    Call<Weather> load(@Query("cityname") String cityname,@Query("key") String apiKey);



    // http://139.196.92.240/wapcenter/requesthome/homepage?hasAllFloor=false
    @GET("homepage")
    Observable<HomeTopBean> load(@Query("hasAllFloor") String b);



    /**
     * retrofit 支持 rxjava 整合
     * 这种方法适用于新接口
     */
    @GET("weather")
    Observable<Weather> getWeatherData(@Query("cityname") String cityname, @Query("key") String apiKey);



    @POST("user/哈哈")
    Observable<Weather> post(@Field("name") String name, @Field("pwd") String pwd);
}

3.封装工具类

public class MyUtils {


    public static OkHttpClient getOkHttpClient(Activity activity){

        //设置缓存路径和大小
        Cache cache = new Cache(activity.getCacheDir(),10*1024*1024);
        //初始化OkHttpClient
        OkHttpClient client = new OkHttpClient();
        client.setConnectTimeout(5, TimeUnit.SECONDS);
        client.setWriteTimeout(5, TimeUnit.SECONDS);
        client.setReadTimeout(5, TimeUnit.SECONDS);
        return client;
    }
}

4.完整代码


public class Main2Activity extends AppCompatActivity {
//完整的url
//    String url = "http://139.196.92.240/wapcenter/requesthome/homepage?hasAllFloor=false";


    String baseUrl = "http://139.196.92.240/wapcenter/requesthome/";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);


        OkHttpClient okHttpClient = MyUtils.getOkHttpClient(this);

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                //这个方法必须有,这样才能返回含有数据的实体类
                .addConverterFactory(GsonConverterFactory.create())
                //要使用retroift和rexjava配合使用这个方法必须有,不然会报Unable to create call adapter
                // for rx.Observable<com.ethanco.retrofit2_0test.HomeTopBean>异常
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .client(okHttpClient)//整合ok
                .build();

        APIService apiService = retrofit.create(APIService.class);

        Observable<HomeTopBean> observable = apiService.load("false");
        observable.subscribeOn(Schedulers.io())//使请求网络的操作运行在子线程
                .observeOn(AndroidSchedulers.mainThread())//使后面的subscribe运行在主线程
                .subscribe(new Subscriber<HomeTopBean>() {
                    @Override
                    public void onCompleted() { //请求网络完成后回调,成功就只回调一次,失败不回调
                        System.out.println("completed");
                    }

                    @Override
                    public void onError(Throwable e) {//失败时回调
                        System.out.println("error");
                    }

                    @Override
                    public void onNext(HomeTopBean bean) {//成功时回调,这就是我们想要的;
                        System.out.println(bean);
                    }
                });
    }
}

//有网络 回调了onNext和onCompleted
//09-10 19:31:31.596 27341-27341/com.ethanco.retrofit2_0test I/System.out: HomeTopBean{errorMsg='',
//09-10 19:31:31.597 27341-27341/com.ethanco.retrofit2_0test I/System.out: completed

//没网或url有问题 第三行才是我后面运行的,前面2行是上面有网络时候的;(不造假,哈哈)
//09-10 19:31:31.596 27341-27341/com.ethanco.retrofit2_0test I/System.out: HomeTopBean{errorMsg='', 
//09-10 19:31:31.597 27341-27341/com.ethanco.retrofit2_0test I/System.out: completed
//09-10 19:32:48.616 28986-28986/com.ethanco.retrofit2_0test I/System.out: error

last: 温馨提示,加了权限了吗? 亲

note: Retrofit+rxjava+okhttp博大精深, 后面有新的用法会加上去, 忘笑纳!!!

下集预告: 图片加载Glide

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页