大家中午好!
我Retrofit在我的应用程序中用于网络调用。该应用程序运行良好,速度非常快。感谢精彩的图书馆。但是,它仅适用于 wi-fi。如果我在 3G 网络中运行该应用程序,则会引发错误。stream was reset: PROTOCOL_ERROR, while using Retrofit in 3G network
我已将此 jar 文件导入到构建路径:

这是完整的堆栈跟踪:
11-17 16:01:54.017: D/Retrofit(3595): java.io.IOException: stream was reset: PROTOCOL_ERROR
11-17 16:01:54.017: D/Retrofit(3595): at com.squareup.okhttp.internal.spdy.SpdyStream.getResponseHeaders(SpdyStream.java:146)
11-17 16:01:54.017: D/Retrofit(3595): at com.squareup.okhttp.internal.http.SpdyTransport.readResponseHeaders(SpdyTransport.java:109)
11-17 16:01:54.017: D/Retrofit(3595): at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:676)
11-17 16:01:54.017: D/Retrofit(3595): at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:426)
11-17 16:01:54.017: D/Retrofit(3595): at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:371)
11-17 16:01:54.017: D/Retrofit(3595): at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:466)
11-17 16:01:54.017: D/Retrofit(3595): at com.squareup.okhttp.internal.huc.DelegatingHttpsURLConnection.getResponseCode(DelegatingHttpsURLConnection.java:105)
11-17 16:01:54.017: D/Retrofit(3595): at com.squareup.okhttp.internal.huc.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:25)
11-17 16:01:54.017: D/Retrofit(3595): at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:73)
11-17 16:01:54.017: D/Retrofit(3595): at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:38)
11-17 …Run Code Online (Sandbox Code Playgroud) 我在https使用Retrofit和运行api调用时收到Lollipop +上的NetworkOnMainThread异常报告RxAndroid.
我已经隔离了代码并创建了以下仍然失败的示例.
这是build.gradle:
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
applicationId "com.example.bug"
minSdkVersion 9
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt')
}
}
lintOptions {
abortOnError false
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.squareup.okhttp:okhttp:2.5.0'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.5.0'
compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta2'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
compile …Run Code Online (Sandbox Code Playgroud) 我正在研究android studio并从网上获取一些数据.我尝试使用OkHttpClient并将jar添加到我的项目文件夹但仍然无法导入它.
它表明can't resolve symbol okhttp.我尝试了一些解决方案,但无法解决问题.这是我的build.gradle文件
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.0"
defaultConfig {
applicationId "com.example.app"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.0.0'
compile 'com.google.android.gms:play-services:8.4.0'
// compile files('libs/okhttp-3.0.1.jar')
// compile files('libs/okio-1.6.0.jar')
}
Run Code Online (Sandbox Code Playgroud) 我尝试使用OkHttp进行Android离线缓存方法.流程是这样的:
if-none-catched向服务器发送一个带有ETag空字符串的HTTP请求,服务器返回一个正确的ETag.我现在的问题是如何存储和检索ETag?OkHttp默认会处理还是我需要在SQLite存储?我一直在谷歌上看OkHttp实现ETag示例代码,但我得到的只是普通的缓存方法.链接我参考:
到目前为止,我所获得的只是第一次服务调用的缓存,但不再从服务器获取最新数据.感谢是否有人可以提供一些指导或找到任何处理ETag和if-none-catch动态的OkHttp分享的好例子.任何澄清都可以随意询问.
尝试为HTTP请求执行一些测试用例.我想区分HTTP/1.1和HTTP/2.为了做到这一点,我需要知道我从请求中使用了哪个版本.我还想强制请求使用HTTP/1.1或HTTP/2.我正在使用OkHttp3 for Java.这是一个简单的请求,我这样做:
Request request = new Request.Builder()
.url(url)
.build();
Response response = client.newCall(request).execute();
return response.body().string();
Run Code Online (Sandbox Code Playgroud) 我有这个服务,我想将令牌作为 okhttp 中的拦截而不是作为参数传递给 @Header("MY_API_KEY")
这是我关于服务的代码
/**
* Provides the [PHService]
*/
fun provideService(): PHService {
val logger = HttpLoggingInterceptor()
logger.level = HttpLoggingInterceptor.Level.BASIC
val client = OkHttpClient.Builder()
.addInterceptor(logger)
.build()
return Retrofit.Builder()
.baseUrl(BuildConfig.API_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(PHService::class.java)
}
Run Code Online (Sandbox Code Playgroud)
如何在此处添加用于标题授权的拦截器?
我最近发现了 MockWebServer 库,并尝试在我的项目中与 Junit 和mockito 一起使用它。
我有这个测试方法:
@Test
public void testGetUsers() throws Exception {
MockWebServer server = new MockWebServer();
server.start();
MockResponse mockedResponse = new MockResponse();
mockedResponse.setResponseCode(200);
mockedResponse.setBody("{}");
server.enqueue(mockedResponse);
server.url("https://my-domain/user/api/users");
JSONObject result = UserService.getUsers();
assertNotNull(result);
server.shutdown();
}
Run Code Online (Sandbox Code Playgroud)
我的方法 getUsers() 执行 Http 调用:
public JSONObject getUsers() {
String urlUser = "https://my-domain/user/api/users";
Request request = new Request.Builder()
.url(urlUser)
.build();
Response response =
MyConf.getOkHttpClient().newCall(request).execute();
.... //process users and return a json Object
}
Run Code Online (Sandbox Code Playgroud)
这是我的 gradle 配置:
compile('com.squareup.okhttp3:okhttp:3.4.2')
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.1.0'
testImplementation 'com.squareup.okhttp3:mockwebserver:3.12.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.1.0'
testCompile …Run Code Online (Sandbox Code Playgroud) 我想使用 Kotlin(v1.3.0)协程和 java.nio.channels。SocketChannel (NIO) 来替代connectAndroid 中的Socket (阻塞 IO)。因为这可以节省很多线程。
下面的代码因为job.await()在 Kotlin 中挂起函数而无法运行,它只能在 Ktolin 协程块中调用。喜欢launch{..},async{..}。
// this function will be called by Java Code
fun connect(address: InetSocketAddress, connectTimeout: Int): SocketChannel {
// Start a new connection
// Create a non-blocking socket channel
val socketChannel = SocketChannel.open()
socketChannel.configureBlocking(false)
// async calls NIO connect function
val job = GlobalScope.async(oneThreadCtx) {
aConnect(socketChannel, address)
}
// I what to suspend(NOT block) current Java Thread, until …Run Code Online (Sandbox Code Playgroud) 我在我的 android 应用程序中使用本地化
虽然语言设置为阿拉伯语,但在 okhttp (okhttp:3.12.0) 的文件上传过程中出现此错误
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.prominere.health1, PID: 7502
java.lang.IllegalArgumentException: Unexpected char 0x662 at 42 in Content-Disposition value: form-data; name="userfile"; filename="IMG_????????_?????????.jpg"
at okhttp3.Headers.checkValue(Headers.java:272)
at okhttp3.Headers.of(Headers.java:224)
at okhttp3.MultipartBody$Part.createFormData(MultipartBody.java:259)
at okhttp3.MultipartBody$Builder.addFormDataPart(MultipartBody.java:324)
at com.prominere.health1.ProfileActivity.onValidationSucceeded(ProfileActivity.java:222)
at com.mobsandgeeks.saripaar.Validator.triggerValidationListenerCallback(Validator.java:719)
at com.mobsandgeeks.saripaar.Validator.validateFieldsWithCallbackTill(Validator.java:697)
at com.mobsandgeeks.saripaar.Validator.validateUnorderedFieldsWithCallbackTill(Validator.java:679)
at com.mobsandgeeks.saripaar.Validator.validate(Validator.java:334)
at com.mobsandgeeks.saripaar.Validator.validate(Validator.java:295)
at com.prominere.health1.ProfileActivity.onClick(ProfileActivity.java:139)
at com.prominere.health1.ProfileActivity_ViewBinding$4.doClick(ProfileActivity_ViewBinding.java:81)
at butterknife.internal.DebouncingOnClickListener.onClick(DebouncingOnClickListener.java:18)
at android.view.View.performClick(View.java:5675)
at android.view.View$PerformClick.run(View.java:22641)
at android.os.Handler.handleCallback(Handler.java:836)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:203)
at android.app.ActivityThread.main(ActivityThread.java:6251)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)
Run Code Online (Sandbox Code Playgroud)
我的代码块是
final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/*");
formBody = …Run Code Online (Sandbox Code Playgroud) 仅从 Android N (--min-api 24) 开始支持静态接口方法: okhttp3.Request okhttp3.Authenticator.lambda$static$0(okhttp3.Route, okhttp3.Response)
okhttp ×10
android ×6
java ×3
kotlin ×2
okhttp3 ×2
retrofit ×2
etag ×1
gradle ×1
interceptor ×1
networking ×1
retrofit2 ×1
rx-android ×1
rx-java ×1