捕获 javax.net.ssl.SSLException:读取错误

问题描述

我正在使用老式的 HttpURLConnection获取位图(这是异步处理的),如下所示:

Bitmap bmp;
boolean fetchOk = false;
try {
    URL url = new URL(strURL);
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setConnectTimeout(timeoutConnectMs);
    connection.setReadTimeout(timeoutReadMs);
    int responseCode = connection.getResponseCode();
    if (responseCode == 200) {
        inputStream = connection.getInputStream();
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inScaled = false;
        bmp = BitmapFactory.decodeStream(inputStream,null,options);
        fetchOk = true;
    }
} catch (Exception e) {
    // I also catch and handle specific Exceptions differently but there is also a catch-all here
    e.printstacktrace();
} finally {
    try {
        inputStream.close();
    } catch (IOException e) {
        e.printstacktrace();
    }
}
if (!fetchOk) {
    // handle retry
    return;
}
// do stuff with fetched bmp

只是偶尔,获取的位图不完整......它中途停止并且下部是空白的。或者有时它完全是空白的。这个位图最终出现在一个小部件中,我有时会在那里看到这些不完整/空白的位图。

认为手机在睡眠后醒来时会出现这种情况,而且我已经有用户报告了类似情况。当它发生在我身上时,日志中包含以下内容

D/My_Stuff(11449): isBitmapInCache: true
D/My_Stuff(11449): getViewId for widget_port
D/My_Stuff(11449): nothingTodo: false
W/System.err(11449): javax.net.ssl.SSLException: Read error: ssl=0x73401b5d88: I/O error during system call,Software caused connection abort
W/System.err(11449):    at com.android.org.conscrypt.NativeCrypto.SSL_read(Native Method)
W/System.err(11449):    at com.android.org.conscrypt.NativeSsl.read(NativeSsl.java:411)
W/System.err(11449):    at com.android.org.conscrypt.ConscryptFileDescriptorSocket$SSLInputStream.read(ConscryptFileDescriptorSocket.java:583)
W/System.err(11449):    at com.android.okhttp.okio.Okio$2.read(Okio.java:145)
W/System.err(11449):    at com.android.okhttp.okio.AsyncTimeout$2.read(AsyncTimeout.java:213)
W/System.err(11449):    at com.android.okhttp.okio.RealBufferedSource.read(RealBufferedSource.java:61)
W/System.err(11449):    at com.android.okhttp.internal.http.Http1xStream$FixedLengthSource.read(Http1xStream.java:602)
W/System.err(11449):    at com.android.okhttp.okio.RealBufferedSource.read(RealBufferedSource.java:61)
W/System.err(11449):    at com.android.okhttp.internal.http.HttpEngine$2.read(HttpEngine.java:1007)
W/System.err(11449):    at com.android.okhttp.okio.RealBufferedSource$1.read(RealBufferedSource.java:397)
W/System.err(11449):    at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
W/System.err(11449):    at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:875)
W/System.err(11449):    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:850)
W/System.err(11449):    at com.myapp.thisis.MyGetStuffTask.call(MyGetStuffTask.java:277)
W/System.err(11449):    at com.myapp.thisis.MyGetStuffTask.call(MyGetStuffTask.java:31)
W/System.err(11449):    at com.myapp.thisis.TaskRunner.lambda$executeAsync$1$TaskRunner(TaskRunner.java:61)
W/System.err(11449):    at com.myapp.thisis.-$$Lambda$TaskRunner$-iWF_J4qwWx8b2L_xWSWxOSc0Nk.run(UnkNown Source:6)
W/System.err(11449):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
W/System.err(11449):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
W/System.err(11449):    at java.lang.Thread.run(Thread.java:919)
D/skia    (11449): ---- read threw an exception
D/My_Stuff(11449): showMessageInWidget (Finishing up…)
D/My_Stuff(11449): getTextViewId for message_port

SSLException前后都有正常的日志记录,异常后进程正常完成,只是结果位图不完整。换句话说,SSLException 似乎没有被 catch 块捕获,因此似乎没有任何方法可以捕获并处理它。

我认为这可能与 this issue 有关(我了解 HttpURLConnection 在 Android 4.4+ 引擎盖下使用 okhttp 因此为什么 okhttp 出现在我的日志中,尽管不直接使用 okhttp 库)。在那里,他们还将问题与打盹模式联系起来。但是那边也没有解决这个问题。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)