在过去的几周里,我们的客户开始看到100个这样的"SSLException错误 - 连接重置连接",我无法弄清楚为什么
我们在okhttp上使用Retrofit,没有特殊配置
public class OkHttpClientProvider implements IOkHttpClientProvider {
OkHttpClient okHttpClient;
public OkHttpClientProvider() {
this.okHttpClient = createClient();
}
public OkHttpClient getOkHttpClient() {
return this.okHttpClient;
}
private OkHttpClient createClient() {
return new OkHttpClient();
}
}
Run Code Online (Sandbox Code Playgroud)上述客户提供商是单身人士.RestAdapter是使用这个注入的客户端构建的(我们使用匕首) -
RestAdapter.Builder restAdapterBuilder = new RestAdapter.Builder()
.setConverter(converter)
.setEndpoint(networkRequestDetails.getServerUrl())
.setClient(new OkClient(okHttpClientProvider.getOkHttpClient()))
.setErrorHandler(new NetworkSynchronousErrorHandler(eventBus))
);
Run Code Online (Sandbox Code Playgroud)
基于堆栈溢出解决方案,我发现了 -
服务器上的保持活动持续时间为180秒,OkHttp的默认值为300秒
服务器在其标头中返回"Connection:close",但客户端请求发送"Connection:keepAlive"
服务器支持TLS 1.0/1.1/1.2并使用Open SSL
我们的服务器最近已转移到另一个托管服务提供商的另一个地理位置,因此我不知道这些是否是DNS故障
我们尝试调整keepAlive之类的东西,在服务器上重新配置OpenSSL,但由于某种原因,Android客户端不断收到此错误
当您尝试使用应用程序发布内容或拉动刷新时,它会立即发生,并且不会出现任何延迟(在发生此异常之前,它甚至不会进入网络或延迟,这意味着连接已经断开).但尝试多次以某种方式"修复它",我们取得了成功.它会在以后再次发生
我们已经在服务器上使我们的DNS条目无效,看看这是否是由它引起的,但是没有帮助
它主要发生在LTE上,但我也在Wifi上看过它
我不想禁用keep alive,因为大多数现代客户都不这样做.此外,我们正在使用OkHttp 2.4,这是后冰淇淋三明治设备的一个问题,所以我希望它应该照顾这些潜在的网络问题.iOS客户端也获得了这些例外但接近100倍(iOS客户端使用AFNetworking 2.0).我正在努力寻找新的东西,在这一点上尝试,任何帮助/想法?
更新 - 通过okhttp添加完整堆栈跟踪
retrofit.RetrofitError: Read error: ssl=0x9dd07200: I/O error during system call, Connection reset by …Run Code Online (Sandbox Code Playgroud) 使用gradle def(https://plus.google.com/+IanLake/posts/JW9x4pcB1rj)在支持v4-r21上添加Multi dex支持
apply plugin: 'com.android.application'
android {
compileSdkVersion 19
buildToolsVersion "20.0.0"
defaultConfig {
applicationId "info.osom.multidex"
minSdkVersion 19
targetSdkVersion 19
versionCode 1
versionName "1.0"
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
dexOptions {
preDexLibraries = false
}
afterEvaluate {
tasks.matching {
it.name.startsWith('dex')
}.each { dx ->
if (dx.additionalParameters == null) {
dx.additionalParameters = []
}
dx.additionalParameters += '--multi-dex'
dx.additionalParameters += "--main-dex-list=$projectDir/multidex.keep".toString()
}
Run Code Online (Sandbox Code Playgroud)
现在这适用于应用程序本身,我能够构建和部署,但是当我为我的Application类运行robolectric测试时,我从ZipUtils(在MultiDex.java中捕获)中失败了.其他测试运行正常.这是痕迹 -
引起:java.lang.RuntimeException:Multi dex安装失败(/ Users/Code/android-code/android /.(是一个目录)).在Android.support.multiDex.install(MultiDex.java:178)的android.support.multidex.MultiDexApplication.attachBaseContext(MultiDexApplication.java:39)android.app.Application.attach(Application.java:181)at at android.support.multidex.MultiDex.install(MultiDex.java:178) org.fest.reflect.method.Invoker.invoke(Invoker.java:112)在org.robolectric.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:155)在org.robolectric.RobolectricTestRunner.setUpApplicationState(RobolectricTestRunner.java:430)在org.robolectric.RobolectricTestRunner $ 2.evaluate(RobolectricTestRunner.java:236)在org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)在org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)在org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)在org.junit.runners.ParentRunner …
我正在尝试创建一个异步POST和DELETE,这是使用Android 4.4中的Retrofit编码的url形式
这是我的客户 -
@FormUrlEncoded
@POST(INetwork.API_BASE_PREFIX + "/memberships.json")
void join(@Field("id") String id, Callback<?> cb);
@FormUrlEncoded
@DELETE(INetwork.API_BASE_PREFIX + "/memberships.json")
void leave(@Field("id") String id, Callback<?> cb);
Run Code Online (Sandbox Code Playgroud)
这是例外 -
java.lang.IllegalArgumentException: IRepositoryClient.leave: FormUrlEncoded can only be specified on HTTP methods with request body (e.g., @POST).
at retrofit.RestMethodInfo.methodError(RestMethodInfo.java:118)
at retrofit.RestMethodInfo.parseMethodAnnotations(RestMethodInfo.java:191)
at retrofit.RestMethodInfo.init(RestMethodInfo.java:128)
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:329)
at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:264)
at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:315)
at retrofit.CallbackRunnable.run(CallbackRunnable.java:42)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at retrofit.Platform$Android$2$1.run(Platform.java:142)
at java.lang.Thread.run(Thread.java:841)
Run Code Online (Sandbox Code Playgroud)
我查看了源代码,基本上如果方法没有正文并且请求是formurlencoded,则抛出此异常.另外我注意到FormUrlEncoded的所有例子都工作正常,因为它不是异步的,即我有某种类型的返回类型而且没有回调 - 抱歉我有点丢失
我应该送一个空身吗?我需要发送一个,而且@Field参数不够吗?
使用Retrofit 1.5.0
试图让一个onclick监听器工作在linearlayout但它永远不会被调用:(.已启用可点击和focsuable(两种模式),仍然无法让点击监听器响应.平台详细信息:Android 3.0 ..任何帮助??下面的代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/menu_items_button"
android:layout_width="0dip"
android:layout_height="fill_parent"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center_horizontal"
android:paddingTop="@dimen/gen_margin_xsmall"
android:paddingBottom="@dimen/gen_margin_xsmall"
android:background="@drawable/rule_bg_menu_button"
android:clickable="true"
android:focusableInTouchMode="true"
>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/menu_items"
android:tag="image"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:tag="text"
android:text="@string/menu_items_icon_txt"
style="@style/textDisplay.mediumLarge"
/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
并在代码中添加事件监听器
_itemsButton = (LinearLayout) menu.findViewById(R.id.menu_items_button);
final Intent itemsIntent = new Intent(this, ItemsActivity.class);
_itemsButton.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(itemsIntent); //Never called!
}
}
);
Run Code Online (Sandbox Code Playgroud)
我这样做而不使用图像按钮的原因是因为"按钮"的背景是基于状态的(渐变变化)而且是图像,并且为了在点击/焦点上组合两个,我使用了一个linearlayout本身就有一个ImageView ..有关为什么clickListener没有在linearLayout上工作的任何建议?
谢谢
这对我来说是一个严重的问题.在具有多层子视图控制器的代码库上工作大约4-5层 - 这是一个平板电脑应用程序,在视图控制器之间具有非常高的解耦程度.第5层子视图控制器想要向顶级视图控制器发送消息以显示模态.第4层和第3层也有不同的消息,所以基本上现在我有4个协议,从嵌入到祖先viewcontroller深处的子视图控制器发送消息变得非常复杂.有更简单的方法吗?
我们考虑过使用NSNotification但不是特别喜欢它,因为它很难调试它,并且订阅不是我们控制范围内的明确依赖.我们还考虑过使用单例,但静态和单例是邪恶的(对吧?)并导致状态和并发问题.
任何帮助表示赞赏.此外,我意识到我意识到这是一个稍微开放的基于设计的问题,但它有一个非常具体的用例(如上所述).
<string
This is a test\n
This is another line.
/>
Run Code Online (Sandbox Code Playgroud)
当换行符(或下一行开头之前的空格)导致新行缩进1个空格时,我尝试在textview中显示此内容.显示基本上这看起来像 -
这是一个测试
This is another line
为什么会发生这种情况,我该如何解决这个问题?有线索吗?