Retrofit学习笔记

作者: 菜鸟_一枚 | 来源:发表于2016-07-24 17:09 被阅读807次

    Retrofit学习笔记

    一、什么是Retrofit框架

    • Retrofit框架是Square公司出品的目前非常流行的网络请求框架、效率高、实现简单。运用注解和动态代理,极大的简化了网络请求的繁琐步奏,非常适合处理REST FUL网络请求,

    特点

    • 性能好、处理快、使用简单。目前安卓最为流行的HTTP Client库之一(速度上听说比volley更快)
    • 使用REST API非常方便
    • 支持NIO(新的IO API,可以替代标准的Java IO API)
    • Retrofit默认使用OKHttp处理网络请求
    • 默认使用GSON解析

    Retrofit2中网络访问常用注解接口

    • @GET GET网络请求方式
    • @PSOT PSOT网络请求方式
    • @Headers 头信息参数
    • @Path 路径参数。替换url地址中"{"和"}"所包括的部分
    • @Query 查询参数,将在地址url中追加类似"page=1"的字符串,形成提交给服务器端的请求参数
    • @QueryMap 查询参数集合,在url地址中追加类似"type=text&count=30&page=1"的字符串
    • @FormUrlEncoded 对表单域中填写内容进行编码处理,避免乱码
    • @Field 指定form表单域中每个空间的name及相应的数值
    • @FieldMap 表单域集合
    • @Multipart Post提交分块请求,如果上传文件,必须指定Multipart
    • @Part POST提交分块请求
    • @Body POST提交分块请求

    Retrofit2代码实现步骤

    五部曲

    • 1、定义一个接口(封装URL地址和数据请求)
    • 2、实例化Retrofit
    • 3、通过Retrofit实例创建接口服务对象
    • 4、接口服务对象调用接口中方法,获得call对象
    • 5、Call对象执行请求(异步、同步请求)

    Retrofit2 GET网络请求中接口方法

    • 1、GET请求,方法中无参数
    @GET("article/list/latest?page")
    Call<ResponseBody> getLatestString();
    
    • 2、GET请求,方法中指定@Path参数和@Query参数。@Path用于替换url地址中"{"和"}"所包括的部分。@Query将在url地址中追加类似"page=1"的字符串,形成提交给服务器端的请求参数
    @GET("article/list/{type}?")
    Call<QiushiModel> getLatesList(@Path("type")) String type,@Query("page") int page);
    
    • 3、GET请求,提交表单数据,方法中定义@QueryMap参数。 @QueryMap参数将在url地址中追加类似"type=text*count=308&page=1"的字符串
    @GET ("MyWeb/RegServlet")
    Call<ResponseBody> getKeyValuePair(@QueryMap Map<String,String> map);
    
    • 4、GET请求,方法中无参数 但是在@Url里面定义完整URL路径,这种情况下BaseUrl会被忽略
    @GET("http://img.234g.com/userup/112/12.jpg")
    Call<ResponseBody> getNetWorkData();
    

    简单使用(不使用Rx)

    基地址
     public final static String BASE_URL = "http://m2.qiushibaike.com/";
    
    接口方法
        @GET("article/list/latest?page=1")
        Call<ResponseBody> getLatestJsonString();
    
    创建接口的工厂
    public class ServerFactory {
    
        public static <T> T createServiceFactory(final Class<T> serverClass, String url) {
    
            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.connectTimeout(10, TimeUnit.SECONDS);
    
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(url)
                    .client(builder.build())
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
    
            return retrofit.create(serverClass);
        }
    }
    
    数据的请求
     private void initData() {
            MyServerInterface serverInterface = ServerFactory.createServiceFactory(MyServerInterface.class, Constant.BASE_URL);
            Call<ResponseBody> call = serverInterface.getLatestJsonString();
            call.enqueue(new Callback<ResponseBody>() {
                @Override
                public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                    // I/yinlei: -------ThreadId------>1  证明返回来的数据是在主线程中的
                    Log.i("yinlei", "-------ThreadId------>" + Thread.currentThread().getId());
                    if (response.isSuccess()) {
                        String result = null;
                        try {
                            result = response.body().string();
                            try {
                                JSONObject resultObject = new JSONObject(result);
                                int errCode = resultObject.getInt("err");
                                if (errCode == 0) {
                                    JSONArray items = resultObject.getJSONArray("items");
                                    // Toast.makeText(MainActivity.this, items.toString(), Toast.LENGTH_SHORT).show();
                                    for (int i = 0; i < items.length(); i++) {
                                        PageBean.ItemsBean item = new Gson().fromJson(items.getString(i), new TypeToken<PageBean.ItemsBean>() {
                                        }.getType());
                                        mItemsBeen.add(item);
                                    }
                                }
                                mTvResult.setText(result);
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
    
                @Override
                public void onFailure(Call<ResponseBody> call, Throwable t) {
                }
            });
        }
    
    结果就是json字符串
    http://m2.qiushibaike.com/article/list/latest?page=1(如果想看结果,可以打开这个链接)
    

    使用RxJava+Retrofit请求数据

    URL地址
    public final static String USER_URL = "https://api.github.com";
    
    接口方法
        //获取个人信息
        @GET("/users/JakeWharton")
        Observable<User> getUserDataObservable();
    
    返回接口的工厂类
    public class ServerFactoryObserver {
    
        public static <T> T createServiceFactory(final Class<T> serverClass, String url) {
            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.connectTimeout(10, TimeUnit.SECONDS);
    
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(url)
                    .client(builder.build())
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
    
            return retrofit.create(serverClass);
        }
    }
    
    数据请求
     MyServerInterface serverInterface = ServerFactoryObserver.createServiceFactory(MyServerInterface.class, Constant.USER_URL);
            serverInterface.getUserDataObservable()
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Subscriber<User>() {
                        @Override
                        public void onCompleted() {
                            mDialog.dismiss();
                        }
    
                        @Override
                        public void onError(Throwable e) {
    
                        }
    
                        @Override
                        public void onNext(User user) {
                            Log.d("UserActivity", user.toString());
                            updateUi(user);
                        }
                    });
    
    小问题说明
      //这个获取JackWharton大神的图片貌似有点问题  地址是获取到了,但是加载不出来
                //通过网页加载url是可以获取的,这里用了一张网络图片地址,是可以正常加载的,暂时不明什么原因
                String conver_url = mUser.getAvatar_url();
                Picasso.with(this).load("http://pic29.nipic.com/20130508/9252150_163600489317_2.jpg").placeholder(R.mipmap.ic_launcher)
                        .into(mIvConver);
    
    演示(貌似我的AS出了问题,所有的字符编码已经UTF-8了,但是提示我编码错误(之前没有的))

    Github地址:

    https://github.com/wuyinlei/RetrofitDemo

    总结

    这里只是简单的使用了retrofit,后面会对retrofit进行简单的封装,加入Rx。今天就到这了。

    相关文章

      网友评论

        本文标题:Retrofit学习笔记

        本文链接:https://www.haomeiwen.com/subject/xkfgjttx.html