Retrofit简单使用(小白都会了)

Posted 高、远

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Retrofit简单使用(小白都会了)相关的知识,希望对你有一定的参考价值。

【1】Retrofit 简单使用

1.1 目的

我们使用Retrofit+OKhttp网络框架完成请求并返回数据显示。


1.2 关于API

我这里使用的是聚合数据,里面有很多免费的接口提供使用。
https://www.juhe.cn/

我这里选择天气预报进行测试。

这里请求地址需要两个参数citykey,city自己传入,key需要用自己的账号申请一个。


1.3Retrofit的使用

1.3.1 配置客户端的API接口WeatherService

我们的测试功能是只需要返回天气信息就行,所以比较简单,只写一个方法就可以了。返回类型是Retorfit内部封装的call类型,如何结合RxJava使用的话,这里返回类型要写成Observable类型。之后会讲到。

public interface WeatherService {
    //获取天气信息
    @GET("simpleWeather/query")
    Call<Weather> getInformation(@Query("city") String city , @Query("key") String key );
}

1.3.2 简单封装一下获取retrofit实例和Service的工具类(单例设计模式)

使用doubleCheck创建retrofit单例对象,getService方法返回的是传入类型的对象。

public class RetrofitUtils {
    private static Retrofit retrofit;
    //双重检查法获取实例对象
    public static <T> T getService(Class<T> serviceClass){
            if(retrofit == null){
                synchronized (RetrofitUtils.class){
                    if(retrofit == null){
                        retrofit = new Retrofit.Builder()
                                .baseUrl("http://apis.juhe.cn")
                                .addConverterFactory(GsonConverterFactory.create())
                                .build();
                    }
                }
            }
            return retrofit.create(serviceClass);
    }
    //私有化构造方法
    private RetrofitUtils(){

    }
}

1.3.3 写一个javabean接收返回的json数据

根据文档的返回值及类型

注意:这里吧result的类型写成Object类型,要不然会出错,因为他不是简单的String类型。

public class Weather {

    private String reason;
    private Object result;
    private int error_code;

    public String getReason() {
        return reason;
    }

    public void setReason(String reason) {
        this.reason = reason;
    }

    public Object getResult() {
        return result;
    }

    public void setResult(Object result) {
        this.result = result;
    }

    public int getError_code() {
        return error_code;
    }

    public void setError_code(int error_code) {
        this.error_code = error_code;
    }

    @Override
    public String toString() {
        return "Weather{" +
                "reason='" + reason + '\\'' +
                ", result=" + result +
                ", error_code=" + error_code +
                '}';
    }
}

1.4 实现效果:

UI布局如下:

MainActivity代码:

public class MainActivity extends AppCompatActivity {

    Button load ;
    TextView address;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        initFunc();
    }

    private void initFunc() {
        load.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String tempAddress = address.getText().toString();
                Log.e("address",tempAddress);
                if(!tempAddress.equals("")){
                    WeatherService weatherService = RetrofitUtils.getService(WeatherService.class);
                    weatherService.getInformation(tempAddress,"****这里换成你申请的秘钥****").enqueue(new Callback<Weather>() {
                        @Override
                        public void onResponse(Call<Weather> call, Response<Weather> response) {
                            Weather weather = response.body();
                            Log.e("test0",weather.toString());
                            if (response.body().getError_code() == 0){
                                String message = response.body().getResult().toString();
                                Log.e("test1",message);
                            }else {
                                Toast.makeText(MainActivity.this,"城市输入有误!",Toast.LENGTH_LONG).show();
                            }
                        }

                        @Override
                        public void onFailure(Call<Weather> call, Throwable t) {
                            Toast.makeText(MainActivity.this,"网络延迟!",Toast.LENGTH_LONG).show();
                            t.printStackTrace();
                        }
                    });
                }else {
                    Toast.makeText(MainActivity.this,"城市不能为空!",Toast.LENGTH_LONG).show();
                }

            }
        });
    }

    private void init() {
        load = findViewById(R.id.load);
        address = findViewById(R.id.address);
    }
}

下面这句话就发起请求:

weatherService.getInformation().enqueue();

测试结果:

可以看到成功的把请求的结果通过Log打印出来了(29度的重庆是真的凉快!)


以上是关于Retrofit简单使用(小白都会了)的主要内容,如果未能解决你的问题,请参考以下文章

小白看完都会了!kafka的配置文件

小白看完都会了!docker删除容器nocontainer

小白看完都会了!java开发后期发展方向

小白看完都会了!javasocket编程聊天室

C语言宏定义的使用,都会了吗?

人工智能-关于CV的这些简单操作你真的都会了吗?