技术概述
Retrofit是一个android的网络申请框架,封装于Okhttp,实际上Retrofit是在Okhttp的根底上实现了申请接口的封装。团队我的项目须要通过网络申请取得用户的数据、菜谱的数据等,须要用到这个技术。Retrofit的一个难点是注解,申请办法、申请头、申请参数等都须要用到注解。

技术详述
增加依赖包

//Retrofitimplementation 'com.squareup.retrofit2:retrofit:2.9.0'

接下来以用户登录的验证为例:
首先定义一个登录接口

public interface UserServices {  @POST("user/login")  Call<UserResponse> getPostUser(@Body RequestBody body);}

*其中注解应用POST因为须要用户的账号密码作为参数传递给后端验证,参数注解将RB对象转化为字符串传递参数。(个别应用GsonConverterFactory转化)
接着创立一个用户数据Response类

public class UserResponse {    private String msg;    private String code;    private DataBean user;    private String token;    //getter    //setter    public class DataBean {        private String user_name;        private String signature = "";        private String tags = "";        //setter        //getter    }}

*封装数据类更不便相干操作

创立Retrofit申请实例

Retrofit retrofit = new Retrofit.Builder()                .baseUrl(Constant.URL_BASE)                .addConverterFactory(GsonConverterFactory.create())                .build();

创立接口申请实例

UserServices userServices = retrofit.create(UserServices.class);RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),new Gson().toJson(map));申请接口调用Call<UserResponse> call = userServices.getPostUser(body);call.enqueue(new Callback<UserResponse>() {            @Override            public void onResponse(Call<UserResponse> call, Response<UserResponse> response) {                if (response.isSuccessful() && response.body().getCode() == null){                }//申请胜利对失去的数据response.body()进行解决            }            @Override            public void onFailure(Call<UserResponse> call, Throwable t) {//申请失败                runOnUiThread(() -> {                    Toast.makeText(LoginActivity.this,"申请失败",Toast.LENGTH_SHORT).show();                });            }        });

技术应用中遇到的问题和解决过程

    public final void runOnUiThread(Runnable action) {        if (Thread.currentThread() != mUiThread) {            mHandler.post(action);        } else {            action.run();        }    }

办法会判断以后线程是否在UI线程,若不在的话,anciton被发送到UI线程的事件队列执行。应用:

runOnUiThread(() -> {//更新UI});

总结
网络申请是和后端数据交互的全过程,其中接口、数据的封装都挺重要的,相应的申请体、参数注解什么的尽管比拟难然而和材料对照起来也不会有特地简单的实现。

相干视频
Android进阶Retrofit网络申请原理解析