zoukankan      html  css  js  c++  java
  • Retrofit网络请求库应用01

    PS:什么是Retrofit?

      在官方文档中有这样一句话--A type-safe HTTP client for Android and Java(一个类型安全的http client库),具体的话就去问百度吧。Retrofit是网络请求库,是一个开源的。主要是写代码会更少,更快,条例更清晰,刚开始学肯定是觉得还是自己写httpconnect好,自己写,想怎么写就怎么写,每个东西都有一个过程,现在主流的网络开源库还有volley,okhttp等,这都不错,今天我就写一篇简单的retrofit使用访问百度,返回百度页面的源码,这仅仅是为了证明该库怎么使用而已,我们先说标红内容,下一篇就是如何快速解析JSON和XML。开始。

    主要内容:

    • Retrofit加载
    • 如何使用
    • GET和POST
    • JSON和XML解析

    1:首先我们要加载Retrofit包

      我的studio是2.0,我在官方文档上看到现在是Retrofit2.3.0,编辑器要求是studio2.3、java7及以上,我在添加依赖的时候找不到该包,所以我只能手动

    compile 'com.squareup.retrofit2:retrofit:2.0.1'
    

     2:创建接口Service,当然这个名字可以随便起。

    先使用GET,/为根目录,在MainActivity中写http://www.baidu.com,总的网址就是http://www.baidu.com/,在后面加了一个/.

    public interface Service {
        @GET("/")
        Call<String> getBaidu();
    }
    

     3:MainActivity中添加Retrofit对象

     Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl("http://www.baidu.com")
                    .addConverterFactory(new Converter.Factory() {
                        @Override
                        public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
                            return new Converter<ResponseBody, String>() {
                                @Override
                                public String convert(ResponseBody value) throws IOException {
                                    return value.string();
                                }
                            };
                        }
                    })
                    .build();
    

     这里需要注意的是:我们在调用百度网址的时候,加载到的数据并不是String,准确来说是二进制流或者说是网络请求回调(请求包,头数据等)。我们需要把它转换成String,Converter<ResponseBody, ?>转换成?(因为不一定是什么类型)。

    .addConverterFactory(new Converter.Factory() {
                        @Override
                        public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
                            return new Converter<ResponseBody, String>() {
                                @Override
                                public String convert(ResponseBody value) throws IOException {
                                    return value.string();//写String即可
                                }
                            };
                        }
                    })
    

     然后拿到Service实例

    Service service = retrofit.create(Service.class);
            Call<String> baidu = service.getBaidu();
            baidu.enqueue(this);
    

     重写两个方法:

     @Override
        public void onResponse(Call<String> call, Response<String> response) {
            Log.e("fanhuizhi",response.body()+"。。。");
        }
    
        @Override
        public void onFailure(Call<String> call, Throwable throwable) {
            throwable.printStackTrace();
            Log.e("fanhuizhi","出错了");
        }
    

     4:添加网络权限

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

     运行结果:

  • 相关阅读:
    网络流24题之圆桌问题
    BZOJ 4276: [ONTAK2015]Bajtman i Okrągły Robin
    网络流24题航空路线问题
    BZOJ1038 瞭望塔
    BZOJ4029 HEOI2015定价
    BZOJ1226 SDOI2009学校食堂
    网络流24题之魔术球问题
    网络流24题之最小路径覆盖问题
    【BZOJ1098】[POI2007]办公楼biu
    BZOJ3065 带插入区间K小值
  • 原文地址:https://www.cnblogs.com/cmusketeer/p/8021631.html
Copyright © 2011-2022 走看看