Android 访问网络:方案三 OkHttp + Retrof

2023-05-10  本文已影响0人  栩檬

本文使用登录场景来简单介绍 Android 应用中使用 OkHttp + Retrofit + RxJava 访问网络的用法。

使用 HTTP 访问网络的准备工作,参见Android 访问网络:方案一 OkHttp一文访问网络的准备工作部分。

使用 OkHttp + Retrofit + RxJava 访问网络


1. 引入依赖

build.gradle(:app)

dependencies {
    ...
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'

    implementation 'com.squareup.okhttp3:logging-interceptor:3.14.9'

    implementation 'io.reactivex.rxjava3:rxandroid:3.0.2'
}

2. 定义网络访问接口

创建 UserService 接口,用来提供 User 模块的网络访问服务。
UserService.java

public interface UserService {

    @POST("user/login")
    Single<Result<String>> login(@Body LoginParam loginParam);

}

Single 是 RxJava 中的一种可观察对象类。Retrofit 为我们创建该类的实例后,即可调用 subscribe() 方法发起 HTTP 请求,然后在 SingleObserver 中处理请求结果。

有些关于 OkHttp + Retrofit + RxJava 的文章中在这里会使用 ObservableObserver

它们两者的区别如下:

HTTP 请求场景可能需要处理的结果有两种:一是请求成功,顺利和服务端交换了数据;二是请求失败。

如果把处理 HTTP 请求结果比作削苹果,那么使用 Single 类似于使用水果刀;而 Observable 更像是使用菜刀。

总的来说,Single 就像是为这个场景量身打造的,而 Observable 则更加通用。都能胜任这个任务,至于选择,就看个人喜好吧。

关于 Result 类和方法注解的介绍,参见Android 访问网络:方案二 OkHttp + Retrofit一文的使用 OkHttp + Retrofit 访问网络-2.定义网络访问接口部分。

3. 创建 Retrofit 实例

  1. 创建 OkHttp 实例,添加日志拦截器,以便调试。
OkHttpClient client = new OkHttpClient.Builder()
    .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
    .build();
  1. 创建 Retrofit 实例,配置 baseUrl , 添加 ConverterFactory 和 CallAdapterFactory 。
Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("http://192.168.43.218:8080/")
    .addConverterFactory(GsonConverterFactory.create())
    .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
    .client(client)
    .build();

4. 创建 Service 实例

UserService userService = retrofit.create(UserService.class);

5. 创建 Single 实例

Single<Result<String>> single = userService.login(new LoginParam(userName, password));

由于这一步比较简单,通常的写法是和下一步连起来,将 Single 的实例作为匿名对象来使用。

userService.login(new LoginParam(userName, password))
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new SingleObserver<Result<String>>() {...});

6. 向服务端发送 HTTP 请求

创建 SingleObserver 实例,用于处理网络访问结果。

single.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new SingleObserver<Result<String>>() {
    @Override
    public void onSubscribe(@NonNull Disposable d) {

    }

    @Override
    public void onSuccess(@NonNull Result<String> result) {
        
    }

    @Override
    public void onError(@NonNull Throwable e) {

    }
});

7. 在 SingleObserver 的 onSuccess() 中处理网络访问结果

@Override
public void onSuccess(@NonNull Result<String> result) {
    Toast.makeText(LoginActivity.this, result.message, Toast.LENGTH_SHORT).show();
    if (result.isSuccessful()) {
        Log.i(TAG, "token : " + result.data);
        // save token
        // start activity
    }
}


测试设备参数

参考资料

  1. Single · ReactiveX 文档中文翻译
  2. ReactiveX : RxJava
  3. ReactiveX : RxAndroid

代码

XuMeng-0 / android-study

上一篇 下一篇

猜你喜欢

热点阅读