问题描述
我正在使用老式的 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 (将#修改为@)