如何使用 RxJava 检查 url 是否正常工作?

How to check if the url is working using a RxJava?

我有 json 回复 ["url1",""url2","url3"..."url10 “] 每个 url 包含图像的地址。 我使用此方法获得了这些 url 的列表:

@GET("task-m-001/list.php")
fun getItems(): Single<List<String>>

2 of 10 urls 不工作。我需要检查每个 url 和过滤器损坏。

我的方法:

    fun getItems(){
    _networkState.postValue(NetworkState.LOADING)

    try {
        compositeDisposable.add(
            apiService.getItems()
                .observeOn(Schedulers.io())
                .subscribeOn(Schedulers.io())
                .flatMapObservable { items ->
                    Observable.fromIterable(items)
                        .flatMap{
                          //Here i need to check urls... How to do that?
                        }
                }
                .toList()
                .subscribe({ urlList ->
                    Log.i(TAG, "getItems: $urlList")
                    val itemsResponse = itemsResponseConverter.getItemResponse(urlList)
                    _downloadedItemsResponse.postValue(itemsResponse)
                    _networkState.postValue(NetworkState.LOADED)
                },
                    {
                        Log.i(TAG, "Error - $it")
                        _networkState.postValue(NetworkState.ERROR)
                    })
        )
    }catch (e: Exception) {
        Log.e(TAG, e.message.toString())
    }
}

如何使用 rxJava 做到这一点?

首先尝试使用 URL 和 HttpURL 连接请求图像 url 并获取响应代码。 如果图像有效,响应代码将为 200 否则无效

现在这是您的代码:

fun getItems(){
    _networkState.postValue(NetworkState.LOADING)

    try {
        compositeDisposable.add(
            apiService.getItems()
                .observeOn(Schedulers.io())
                .subscribeOn(Schedulers.io())
                .flatMapObservable { items ->
                    Observable.fromIterable(items)
                        .flatMap{
                          val url:URL = URL(imageUrl)
                          val http: HttpURLConnection: = url.openConnection() as HttpURLConnection
                          val statusCode: Integer = http.responseCode
                          return if(statusCode == 200) // correct image url
                        }
                }
                .toList()
                .subscribe({ urlList ->
                    Log.i(TAG, "getItems: $urlList")
                    val itemsResponse = itemsResponseConverter.getItemResponse(urlList)
                    _downloadedItemsResponse.postValue(itemsResponse)
                    _networkState.postValue(NetworkState.LOADED)
                },
                    {
                        Log.i(TAG, "Error - $it")
                        _networkState.postValue(NetworkState.ERROR)
                    })
        )
    }catch (e: Exception) {
        Log.e(TAG, e.message.toString())
    }
}