美文网首页
使用 Kotlin 和 RxJava 进行改造 - Androi

使用 Kotlin 和 RxJava 进行改造 - Androi

作者: 安安_660c | 来源:发表于2022-07-23 11:48 被阅读0次

前言

网络是任何 Android 应用程序的主要组件之一。有很多很好的库可以帮助我们轻松地建立网络。此类库的一些示例包括 Retrofit 和FastAndroidNetworking

在本文中,我将为您提供使用 Retrofit 与 RxJava 和 Kotlin 构建 Android 应用程序所需的基本设置和概念

改造简介

Retrofit 是一个 REST 客户端,它使用 OkHttp 作为 HttpClient 和 Json 解析器来解析响应。OkHttp 已成为几乎所有 Android 应用程序中事实上的 Http 客户端。Retrofit 基本上为 OkHttp 提供了更好的包装器。

设置改造的简单步骤

object Networking {

    private const val NETWORK_CALL_TIMEOUT = 60

    fun create(baseUrl: String, cacheDir: File, cacheSize: Long): NetworkService {
        return Retrofit.Builder()
            .baseUrl(baseUrl)
            .client(
                OkHttpClient.Builder()
                    .cache(Cache(cacheDir, cacheSize))
                    .addInterceptor(HttpLoggingInterceptor()
                        .apply {
                            level = if (BuildConfig.DEBUG) 
                                HttpLoggingInterceptor.Level.BODY
                            else 
                                HttpLoggingInterceptor.Level.NONE
                        })
                    .readTimeout(NETWORK_CALL_TIMEOUT.toLong(), TimeUnit.SECONDS)
                    .writeTimeout(NETWORK_CALL_TIMEOUT.toLong(), TimeUnit.SECONDS)
                    .build()
            )
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build()
            .create(NetworkService::class.java)
    }
}

您可以像这样创建一个 NetworkService 的实例

Networking.create(
    "https://example.mindorks.com/",
    application.cacheDir,
    10 * 1024 * 1024 // 10MB
)

你知道什么是 NetworkService

你一定没有,因为我还没有解释过。再等一段时间。在此之前,让我们尝试了解配置中提供的各种实例来创建 NetworkService(直到这里是一个幽灵)。

  • BaseUrl:这是定义所有 API 通用的 URL 部分的字符串。

  • OkHttpClient将网络的所有功能添加到 Retrofit 中。如果要显式自定义它们,则需要在其构建器中定义一些东西,否则大多数这些东西将回退到默认值。

  • 缓存:使用它来启用和设置 OkHttp 的离线缓存能力。

  • HttpLoggingInterceptor:这是一个拦截器,它将在 logcat 中记录 API 的请求和响应以进行调试构建。

  • Timeouts:它提供了从服务器读取和在客户端写入的 Http 连接时间限制。

  • GsonConvertorFactory:您需要指定应使用哪个库 Retrofit 进行序列化和反序列化。这里使用了 Gson,它是一个流行的库,有助于对象到 JSON 和 JSON 到对象的转换。

  • RxJava2CallAdapterFactory:Retrofit 默认提供Call对象来获取 HTTP 响应。但是在我们的例子中,我们需要在Observable或Single中观察我们的响应,就像我们的代码示例中一样。因此,为了实现这一点,我们需要告诉 Retrofit 使用 RxJava 而不是其默认的调用包装器。

  • NetworkService:使用上述配置构建 Retrofit 实例后,需要传递定义 Retrofit 需要处理的 API 签名的接口。我们现在将探索NetworkService。

interface NetworkService {

    /*---------------------HTTP METHODS-----------------------------*/
    // makes http get request with header
    @GET("dummy/list") // endpoint will be appended to the base url
    fun doDummyGetRequestCall(
        @Header("some-header-key") someHeader: String
    ): Single<DummyResponse>

    // makes http post request with body and header
    @POST("dummy/list")
    fun doDummyPostRequestCall(
        @Body request: DummyRequest,
        @Header("some-header-key") someHeader: String,
        @Header("some-more-header-key") someMoreHeader: String
    ): Single<DummyResponse>

    // makes http put request with body and header
    @PUT("dummy/list")
    fun doDummyPutRequestCall(
        @Body request: DummyRequest,
        @Header("some-header-key") someHeader: String
    ): Single<DummyResponse>

    // makes http delete request with body and header
    @DELETE("dummy/list")
    fun doDummyDeleteRequestCall(
        @Header("some-header-key") someHeader: String,
        @Header("some-more-header-key") someMoreHeader: String
    ): Single<DummyResponse>

    /*----------------------ADDITIONAL THINGS---------------------------*/

    // makes http get request with dynamic endpoint and header
    @GET("dummy/{userId}/list")
    fun doDummyGetRequestVariablePathCall(
        @Path("userId") userId: String,
        @Header("some-header-key") someHeader: String
    ): Single<DummyResponse>

    // makes http get request with query parameter and header
    // base url + dummy/list/search?query=<some query value>
    @GET("dummy/list/search")
    fun doDummyGetRequestQueryParamsCall(
        @Query("query") query: String,
        @Header("some-header-key") someHeader: String
    ): Single<DummyResponse>
}

下面提供了请求和响应类

data class DummyRequest(
    @Expose
    @SerializedName("id")
    var id: String
)

data class DummyResponse(

    @Expose
    @SerializedName("message")
    var message: String,

    @Expose
    @SerializedName("data")
    val data: List<Dummy>
)

data class Dummy(
    @Expose
    @SerializedName("name")
    val name: String,

    @Expose
    @SerializedName("imageUrl")
    val imageUrl: String?
)
  • Multipart:您可以使用 multipart 在单个请求中上传多个文件和图像。
@Singleton
interface NetworkService {

    ...

    @Multipart
    @POST("user/profile-pic")
    fun doImageUploadCall(
        @Part image: MultipartBody.Part,
        @Header("some-header-key") someHeader: String
    ): Single<ImageUploadResponse>
}

data class ImageUploadResponse(

    @Expose
    @SerializedName("message")
    val message: String,

    @Expose
    @SerializedName("imageUrl")
    val imageUrl: String
)

fun makeImageUpload(image: File): Single<String> {
    val filePart = MultipartBody.Part.createFormData(
        "image",
        image.name,
        RequestBody.create(MediaType.parse("image/*"), image))
    return networkService.doImageUploadCall(filePart).map { /*Do Somthing*/ }
}

本文到此结束。我希望您一定已经掌握了在 Android 应用程序中处理网络的概念。

作者:Janishar Ali
链接:https://blog.mindorks.com/getting-started-with-retrofit-using-kotlin-and-rxjava-android-networking-library

相关文章

网友评论

      本文标题:使用 Kotlin 和 RxJava 进行改造 - Androi

      本文链接:https://www.haomeiwen.com/subject/kthbirtx.html