关于android:使用Retrofit进行网络请求

3次阅读

共计 1765 个字符,预计需要花费 5 分钟才能阅读完成。

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

技术详述
增加依赖包

//Retrofit
implementation '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 网络申请原理解析

正文完
 0