Retrofit学习笔记

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。今天就到这了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值