net*_*ein 2 kotlin firebase retrofit2 rx-java2 firebase-performance
因此,我尝试集成 Http 请求的 Firebase 性能并手动添加它们,如此处所示(步骤 9)。
我正在使用 Retrofit 2 和 RxJava 2,所以我想到了做一个自定义运算符,检查下面的代码:
改造 2 客户端
@GET("branch-{environment}/v2/branches")
fun getBranch(@Path("environment") environment: String, @Query("location") location: String, @Query("fulfilment_type") fulfilmentType: String): Single<Response<GetBranchResponse>>
Run Code Online (Sandbox Code Playgroud)
RxJava 调用 Retrofit 客户端
private val client: BranchClient = clientFactory.create(urlProvider.apiUrl)
override fun getBranch(postCode: String, fulfilmentType: FulfilmentType): Single<GetBranchResponse> {
return client
.getBranch(environment, postCode.toUpperCase(), fulfilmentType.toString())
.lift(RxHttpPerformanceSingleOperator(URL?, METHOD?))
.map { it.body() }
.subscribeIO() //custom Kotlin extension
.observeMain() //custom Kotlin extension
...
}
Run Code Online (Sandbox Code Playgroud)
RxJava 2 自定义操作符通过 lift:
class RxHttpPerformanceSingleOperator<T>(private val url: String, private val method: String) : SingleOperator<Response<T>, Response<T>> {
private lateinit var metric: HttpMetric
@Throws(Exception::class)
override fun apply(observer: SingleObserver<in Response<T>>): SingleObserver<in Response<T>> {
return object : SingleObserver<Response<T>> {
override fun onSubscribe(d: Disposable) {
metric = FirebasePerformance.getInstance().newHttpMetric(url,
method.toUpperCase())
metric.start()
observer.onSubscribe(d)
}
override fun onSuccess(t: Response<T>) {
observer.onSuccess(t)
//More info: https://firebase.google.com/docs/perf-mon/get-started-android
metric.setRequestPayloadSize(t.raw().body().contentLength())
metric.setHttpResponseCode(t.code())
metric.stop()
}
override fun onError(e: Throwable) {
observer.onError(e)
metric.stop()
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以目前我不确定如何以正确的方式获取请求的 URL 和方法(标记为 URL?和 METHOD?)发送给操作员,
我需要他们在 onSubscribe 上启动指标..但我没有得到回应...
目前 UGLYYYYYYYY 我的做法是:
添加到改造客户端:
@GET("branch-{environment}/v2/branches")
fun getBranchURL(@Path("environment") environment: String, @Query("location") location: String, @Query("fulfilment_type") fulfilmentType: String): Call<JsonObject>
Run Code Online (Sandbox Code Playgroud)
添加参数如下:
val request = client.getBranchURL(environment, postCode.toUpperCase(), fulfilmentType.toString()).request()
url = request.url().toString()
method = request.method()
Run Code Online (Sandbox Code Playgroud)
这使得我在客户端上每个请求都有 2 个条目......这没有意义。
一路上有一些有用的线索: -如何使用 rxjava 在 Retrofit 2.0 中获取请求 url?
添加一个 RetrofitInterceptor到你的HttpClient.Builder并在那里FirebaseInstance生成你的HttpMetrics:
class FirebasePerformanceInterceptor(val performanceInstance: FirebasePerformance) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
//Get request values
val url = request.url().url()
val requestPayloadSize = request.body()?.contentLength() ?: 0L
val httpMethod = request.method()
//Initialize http trace
val trace = performanceInstance.newHttpMetric(url, httpMethod)
trace.setRequestPayloadSize(requestPayloadSize)
trace.start()
//Proceed
val response = chain.proceed(chain.request())
//Get response values
val responseCode = response.code()
val responsePayloadSize = response.body()?.contentLength() ?: 0L
//Add response values to trace and close it
trace.setHttpResponseCode(responseCode)
trace.setResponsePayloadSize(responsePayloadSize)
trace.stop()
return response
}
}
Run Code Online (Sandbox Code Playgroud)
您可以直接复制并粘贴此代码即可运行。享受!
| 归档时间: |
|
| 查看次数: |
1244 次 |
| 最近记录: |