标签:
Retrofit 是一套 RESTful 架构的 Android(Java) 客户端实现,基于注解,提供 JSON to POJO(Plain Ordinary Java Object ,简单 Java 对象),POJO to JSON,网络请求(POST,GET, PUT,DELETE 等)封装。
既然只是一个网络请求封装库,现在已经有了那么多的大家已经耳熟能详的网络请求封装库了,为什么还要介绍它呢,原因在于 Retrofit 是一套注解形的网络请求封装库,让我们的代码结构更给为清晰。它可以直接解析JSON数据变成JAVA对象,甚至支持回调操作,处理不同的结果。 
想更详细的了解 Retrofit,可以查看官方文档 。
进入主题。
目前我使用的是AndroidStudio,那么在model的build.gradle文件中添加以下引用:
compile 'com.squareup.okhttp3:okhttp:3.2.0' compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4' compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta3'
说明:
Retrofit依赖于okhttp,所以需要集成okhttp 
API返回的数据为JSON格式,在此我使用的是Gson对返回数据解析.请使用最新版的Gson
使用的是百度API的数据接口:名人名言API 
该接口的API主机地址为:http://apistore.baidu.com; 
需要访问的接口:avatardata/mingrenmingyan/lookup;
需要一个key等于apikey的Header和一个keyword等于名人名言的查询关键字,而且该请求为GET请求.
访问该API返回的数据格式如下:
{
    "total": 227,
    "result": [
        {
            "famous_name": "车尔尼雪夫斯基",
            "famous_saying": "非凡的单纯,非凡的明确——这是天才的智慧的最可惊人的品质。"
        },
        {
            "famous_name": "约·德莱顿",
            "famous_saying": "天才在社会生活中往往显得迟钝而"
        },
        {
            "famous_name": "雨果",
            "famous_saying": "敢于冲撞命运才是天才"
        },
        {
            "famous_name": "卡莱尔",
            "famous_saying": "所谓天才,就是比任何人都先抵挡痛苦的经验本领。"
        },
        {
            "famous_name": "林肯",
            "famous_saying": "卓越的天才不屑走一条人家走过的路。他寻找迄今没有开拓过的地区。"
        }
    ],
    "error_code": 0,
    "reason": "Succes"
}
我们根据上面API返回的json数据来创建一个FamousInfo数据对象,我们可以利用AndroidStudio插件 GsonFormat 快速,方便的将json数据转为Java 对象, 
FamousInfo.java
package com.baidu.retrofit.bean;
import java.util.List;
public class FamousInfo {
    /*{
        "total": 227,
            "result": [
        {
            "famous_name": "车尔尼雪夫斯基",
                "famous_saying": "非凡的单纯,非凡的明确——这是天才的智慧的最可惊人的品质。"
        },
        {
            "famous_name": "约·德莱顿",
                "famous_saying": "天才在社会生活中往往显得迟钝而"
        },
        {
            "famous_name": "雨果",
                "famous_saying": "敢于冲撞命运才是天才"
        },
        {
            "famous_name": "卡莱尔",
                "famous_saying": "所谓天才,就是比任何人都先抵挡痛苦的经验本领。"
        },
        {
            "famous_name": "林肯",
                "famous_saying": "卓越的天才不屑走一条人家走过的路。他寻找迄今没有开拓过的地区。"
        }
        ],
        "error_code": 0,
            "reason": "Succes"
    }*/
    //下面变量的定义要与接口中的字段名字保持一致
    private int total;
    private int error_code;
    private String reason;
    private List<ResultEntity> result;
    public static class ResultEntity {
        private String famous_name;
        private String famous_saying;
        public void setFamous_name(String famous_name) {
            this.famous_name = famous_name;
        }
        public void setFamous_saying(String famous_saying) {
            this.famous_saying = famous_saying;
        }
        public String getFamous_name() {
            return famous_name;
        }
        public String getFamous_saying() {
            return famous_saying;
        }
    }
    public int getTotal() {
        return total;
    }
    public void setTotal(int total) {
        this.total = total;
    }
    public int getError_code() {
        return error_code;
    }
    public void setError_code(int error_code) {
        this.error_code = error_code;
    }
    public String getReason() {
        return reason;
    }
    public void setReason(String reason) {
        this.reason = reason;
    }
    public List<ResultEntity> getResult() {
        return result;
    }
    public void setResult(List<ResultEntity> result) {
        this.result = result;
    }
}
首先, 按照官方的说明,我们需要创建一个接口,返回 Call;如下:
package com.baidu.retrofit.intf;
import com.baidu.retrofit.bean.FamousInfo;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Query;
/**
 * Created by lizhixian on 16/5/8.
 */
public interface IFamousInfo {
    @GET("/avatardata/mingrenmingyan/lookup")
    Call<FamousInfo> getFamousResult(@Header("apiKey") String apiKey,
                                     @Query("keyword") String keyword,
                                     @Query("page") int page,
                                     @Query("rows") int rows);
}
这里我们使用的是Retrofit 提供注解的方式来定义接口的 
* @get后面我们填写需要访问对应的接口地址 
* @Header用来添加Header 
* @Query用来添加查询关键字
现在接口定义好了,我们来*定义Retrofit 网络接口服务的包装类 :
package com.baidu.retrofit;
import android.content.Context;
import retrofit2.GsonConverterFactory;
import retrofit2.Retrofit;
/**
 * Created by lizhixian on 16/5/8.
 */
public class RetrofitWrapper {
    private static RetrofitWrapper instance;
    private Context mContext;
    private Retrofit mRetrofit;
    public RetrofitWrapper() {
        mRetrofit = new Retrofit.Builder().baseUrl(Constant.BASEURL)
                .addConverterFactory(GsonConverterFactory.create()).build();
    }
    public  static RetrofitWrapper getInstance(){
        if(null == instance){
            synchronized (RetrofitWrapper.class){
                instance = new RetrofitWrapper();
            }
        }
        return instance;
    }
    public <T> T create(final Class<T> service) {
        return mRetrofit.create(service);
    }
}
网络服务的包装类定义好了之后,在定义一个访问的Model。package com.baidu.retrofit.model;
import android.content.Context;
import com.baidu.retrofit.RetrofitWrapper;
import com.baidu.retrofit.bean.FamousInfo;
import com.baidu.retrofit.bean.FamousInfoReq;
import com.baidu.retrofit.intf.IFamousInfo;
import retrofit2.Call;
/**
 * Created by lizhixian on 16/5/8.
 */
public class FamousInfoModel {
    private static FamousInfoModel famousInfoModel;
    private IFamousInfo mIFamousInfo;
    public FamousInfoModel(Context context) {
        mIFamousInfo = RetrofitWrapper.getInstance().create(IFamousInfo.class);
    }
    public static FamousInfoModel getInstance(Context context){
        if(famousInfoModel == null) {
            famousInfoModel = new FamousInfoModel(context);
        }
        return famousInfoModel;
    }
    /**
     * 查询接口
     * @param famousInfoReq
     * @return
     */
    public Call<FamousInfo> queryLookUp(FamousInfoReq famousInfoReq) {
        Call<FamousInfo> infoCall = mIFamousInfo.getFamousResult(famousInfoReq.apiKey, famousInfoReq.keyword, famousInfoReq.page, famousInfoReq.rows);
        return infoCall;
    }
}
构建好接口以后,可以使用了!
使用分为四步:
package com.baidu.retrofit;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.baidu.retrofit.bean.FamousInfo;
import com.baidu.retrofit.bean.FamousInfoReq;
import com.baidu.retrofit.model.FamousInfoModel;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    public final String TAG= this.getClass().getName();
    private FamousInfoModel famousInfoModel;
    @BindView(R.id.edit_keyword)
    EditText mEditKeyWord;
    @BindView(R.id.button_search)
    Button mSerachBtn;
    @BindView(R.id.txt_content)
    TextView mTxtContent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        initView();
        famousInfoModel = FamousInfoModel.getInstance(this);
    }
    /**
     * 初始化View
     */
    private void initView() {
    }
    @Override
    @OnClick({ R.id.button_search })
    public void onClick(View view) {
        Log.d(TAG,"onclick");
        if(view.getId() == R.id.button_search) {
            famousInfoModel.queryLookUp(initParams()).enqueue(new Callback<FamousInfo>() {
                @Override
                public void onResponse(Call<FamousInfo> call, Response<FamousInfo> response) {
                    if(response.isSuccess()) {
                        FamousInfo result = response.body();
                        if(null != result) {
                            List<FamousInfo.ResultEntity> entity = result.getResult();
                            mTxtContent.setText("1、"+entity.get(0).getFamous_saying()+"\n---"+entity.get(0).getFamous_name()+"\n 2、"
                                    +entity.get(1).getFamous_saying()+"\n---"+entity.get(1).getFamous_name());
                        }
                    }
                }
                @Override
                public void onFailure(Call<FamousInfo> call, Throwable t) {
                }
            });
        }
    }
    private FamousInfoReq initParams() {
        FamousInfoReq mFamousInfoReq = null;
        mFamousInfoReq= new FamousInfoReq();
        mFamousInfoReq.apiKey= Constant.APIKEY;
        mFamousInfoReq.keyword = mEditKeyWord.getText().toString();
        mFamousInfoReq.page=1;
        mFamousInfoReq.rows=20;
        return  mFamousInfoReq;
    }
}
附上源码:https://github.com/jdsjlzx/RetrofitDemo
本文参考并借鉴了博客:http://blog.csdn.net/u011974987/article/details/50895633
如果不想使用注解,请到上面博客下载代码。
最后感谢_xuhao的奉献。
标签:
原文地址:http://blog.csdn.net/jdsjlzx/article/details/51354778