Merge pull request #1705 from ag2s20150909/master
在Android7.0 及以上使用jdk8的CompletableFuture替代旧的基于轮询的ConditionVariablepull/1710/head
commit
e2c13c92ae
@ -0,0 +1,66 @@ |
|||||||
|
package io.legado.app.help.http.cronet |
||||||
|
|
||||||
|
|
||||||
|
import android.os.Build |
||||||
|
import androidx.annotation.RequiresApi |
||||||
|
import okhttp3.Call |
||||||
|
import okhttp3.Request |
||||||
|
import okhttp3.Response |
||||||
|
import org.chromium.net.CronetException |
||||||
|
import org.chromium.net.UrlRequest |
||||||
|
import org.chromium.net.UrlResponseInfo |
||||||
|
import java.io.IOException |
||||||
|
import java.nio.ByteBuffer |
||||||
|
import java.util.concurrent.CompletableFuture |
||||||
|
import java.util.concurrent.TimeUnit |
||||||
|
|
||||||
|
@RequiresApi(api = Build.VERSION_CODES.N) |
||||||
|
class NewCallBack(originalRequest: Request, mCall: Call) : AbsCallBack(originalRequest, mCall) { |
||||||
|
private val responseFuture = CompletableFuture<Response>() |
||||||
|
|
||||||
|
|
||||||
|
@Throws(IOException::class) |
||||||
|
override fun waitForDone(urlRequest: UrlRequest): Response { |
||||||
|
return responseFuture.get(mCall.timeout().timeoutNanos(), TimeUnit.NANOSECONDS) |
||||||
|
} |
||||||
|
|
||||||
|
override fun onRedirectReceived( |
||||||
|
request: UrlRequest, |
||||||
|
info: UrlResponseInfo, |
||||||
|
newLocationUrl: String |
||||||
|
) { |
||||||
|
super.onRedirectReceived(request, info, newLocationUrl) |
||||||
|
if (mException != null) { |
||||||
|
responseFuture.completeExceptionally(mException) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
override fun onReadCompleted( |
||||||
|
request: UrlRequest, |
||||||
|
info: UrlResponseInfo, |
||||||
|
byteBuffer: ByteBuffer |
||||||
|
) { |
||||||
|
super.onReadCompleted(request, info, byteBuffer) |
||||||
|
if (mException != null) { |
||||||
|
responseFuture.completeExceptionally(mException) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
override fun onSucceeded(request: UrlRequest, info: UrlResponseInfo) { |
||||||
|
super.onSucceeded(request, info) |
||||||
|
responseFuture.complete(mResponse) |
||||||
|
} |
||||||
|
|
||||||
|
override fun onFailed(request: UrlRequest, info: UrlResponseInfo?, error: CronetException) { |
||||||
|
super.onFailed(request, info, error) |
||||||
|
responseFuture.completeExceptionally(mException) |
||||||
|
} |
||||||
|
|
||||||
|
override fun onCanceled(request: UrlRequest?, info: UrlResponseInfo?) { |
||||||
|
super.onCanceled(request, info) |
||||||
|
responseFuture.completeExceptionally(mException) |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,66 @@ |
|||||||
|
package io.legado.app.help.http.cronet |
||||||
|
|
||||||
|
import android.os.ConditionVariable |
||||||
|
import okhttp3.Call |
||||||
|
import okhttp3.Request |
||||||
|
import okhttp3.Response |
||||||
|
import org.chromium.net.CronetException |
||||||
|
import org.chromium.net.UrlRequest |
||||||
|
import org.chromium.net.UrlResponseInfo |
||||||
|
import java.io.IOException |
||||||
|
import java.nio.ByteBuffer |
||||||
|
|
||||||
|
class OldCallback(originalRequest: Request, mCall: Call) : AbsCallBack(originalRequest, mCall) { |
||||||
|
|
||||||
|
private val mResponseCondition = ConditionVariable() |
||||||
|
|
||||||
|
@Throws(IOException::class) |
||||||
|
override fun waitForDone(urlRequest: UrlRequest): Response { |
||||||
|
//获取okhttp call的完整请求的超时时间 |
||||||
|
val timeOutMs: Long = mCall.timeout().timeoutNanos() / 1000000 |
||||||
|
if (timeOutMs > 0) { |
||||||
|
mResponseCondition.block(timeOutMs) |
||||||
|
} else { |
||||||
|
mResponseCondition.block() |
||||||
|
} |
||||||
|
//ConditionVariable 正常open或者超时open后,检查urlRequest是否完成 |
||||||
|
if (!urlRequest.isDone) { |
||||||
|
urlRequest.cancel() |
||||||
|
mException = IOException("Cronet timeout after wait " + timeOutMs + "ms") |
||||||
|
} |
||||||
|
|
||||||
|
if (mException != null) { |
||||||
|
throw mException as IOException |
||||||
|
} |
||||||
|
return this.mResponse |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
override fun onReadCompleted( |
||||||
|
request: UrlRequest, |
||||||
|
info: UrlResponseInfo, |
||||||
|
byteBuffer: ByteBuffer |
||||||
|
) { |
||||||
|
super.onReadCompleted(request, info, byteBuffer) |
||||||
|
if (mException != null) { |
||||||
|
mResponseCondition.open() |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
override fun onSucceeded(request: UrlRequest, info: UrlResponseInfo) { |
||||||
|
super.onSucceeded(request, info) |
||||||
|
mResponseCondition.open() |
||||||
|
} |
||||||
|
|
||||||
|
override fun onFailed(request: UrlRequest, info: UrlResponseInfo?, error: CronetException) { |
||||||
|
super.onFailed(request, info, error) |
||||||
|
mResponseCondition.open() |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
override fun onCanceled(request: UrlRequest?, info: UrlResponseInfo?) { |
||||||
|
super.onCanceled(request, info) |
||||||
|
mResponseCondition.open() |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue