Android Retrofit2使用教程-小白篇

如果你还不是很清楚retrofit是干嘛的,那我简单地用一句大白话来说明:它就是用来进行网络请求的。
Retrofit使用注解的方式将我们的HTTP请求转变为一个接口。

我个人崇尚“先学会基本用法,再学会高级用法,最后采取了解原理”,下面我会手把手教导你如何使用Retrofit2进行最简单的HTTP Get请求

这里,我们使用一个手机归属地查询的API进行测试:
http://cx.shouji.360.cn/phonearea.php?number=13188888888

这是360提供的API,不需要开发者账号,API_KEY什么的,因此很方便。
使用百度的API测试工具测试结果如下:

Android Retrofit2使用教程-小白篇_第1张图片

可见该查询接口返回的是JSON格式,返回的两个键值分别是code和data。

一、新建项目,添加依赖

项目名为RetrofitDemo,为了防止大家疏忽,先在AndroidManifest.xml把网络权限添加上吧:

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

然后在app->build.gradle的dependencies中添加如下依赖:

   compile 'com.squareup.retrofit2:retrofit:2.3.0'
   compile 'com.squareup.retrofit2:converter-gson:2.3.0'

如何不知道retrofit2的最新版本,可以在file->Project Structure->modules(app)的dependencies标签页->选择‘+’号搜索添加依赖,如图:
Android Retrofit2使用教程-小白篇_第2张图片

输入retrofi搜索,注意选中retrofit2而不时retrofit
Android Retrofit2使用教程-小白篇_第3张图片

同样的步骤搜索converter-gson,注意要选retrofit2:converter-gson,不要选错了
Android Retrofit2使用教程-小白篇_第4张图片

可见这两个库的目前的最新版本是2.3.0

添加完毕后在app->build.gradle中的dependencies中自然会出现如下依赖:
Android Retrofit2使用教程-小白篇_第5张图片

创建实体类和Retrofit接口

我们使用Gson解析API查询返回的JSON格式,先根据API的返回结果创建实体类PhoneResult.class和PhoneData.class

PhoneResult.class:对应返回的Json对象,具有code和data两个键

public class PhoneResult {
    private int code;
    private PhoneData data;

    public void setData(PhoneData data) {
        this.data = data;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public PhoneData getData() {
        return data;
    }

    public int getCode() {
        return code;
    }
}

PhoneData.class:data键对应的Json对象,包含手机号所属省份、城市和供应商

public class PhoneData {
    private String province;
    private String city;
    private String sp;

    public void setSp(String sp) {
        this.sp = sp;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getSp() {
        return sp;
    }

    public String getProvince() {
        return province;
    }

    public String getCity() {
        return city;
    }
}

Retrofit使用接口和注解的形式来发起请求的,因此接下来定义请求接口
ApiService.java:注释应该写得比较详细了,就不细说了

public interface ApiService {

    /**
     * 请求API是:http://cx.shouji.360.cn/phonearea.php?number=13188888888
     * 把资源定位的部分放在GET注解内,注意该部分不能以/作为开头
     * Call指明请求返回的数据将装换为PhoneResult
     * getPhoneResult方法是发起请求时回调的方法,参数number对应API请求中的number参数
     */
    @GET("phonearea.php")
    Call getPhoneResult(@Query("number")String number);

}

三、发起请求

MainActivity.class

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class MainActivity extends AppCompatActivity {

    //输入手机号
    EditText et;
    //发起请求的按钮
    Button btn;
    //显示请求结果
    TextView tv;

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

        btn = (Button) findViewById(R.id.btn);
        et = (EditText) findViewById(R.id.et);
        tv = (TextView) findViewById(R.id.tv);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Retrofit retrofit = new Retrofit.Builder()
                        .addConverterFactory(GsonConverterFactory.create())
                        //注意这里是请求的主机名,必须以/结尾
                        .baseUrl("http://cx.shouji.360.cn/")
                        .build();
                //生成ApiService的实例
                ApiService apiService = retrofit.create(ApiService.class);
                Call call = apiService.getPhoneResult(et.getText().toString());
                //发起网络请求
                call.enqueue(new Callback() {
                    @Override
                    public void onResponse(Call call, Response response) {
                        //请求成功
                        PhoneResult result = response.body();
                        PhoneData data = result.getData();
                        tv.setText(data.getProvince() + " " + data.getCity() + " " + data.getSp());
                    }

                    @Override
                    public void onFailure(Call call, Throwable t) {

                    }
                });

            }
        });

    }
}

运行结果如下:
Android Retrofit2使用教程-小白篇_第6张图片

好了,关于Retrofit2进行Get请求的小白教程就说到这了,以后有空再把Retrofit2更详尽的使用方法和原理补充完吧。

源码下载

你可能感兴趣的:(android-框架)