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
ので、これを捕まえて対処する方法はないようです。
この問題に関連している可能性があると思います(Android 4.4以降の内部でHttpURLConnection
使用されているため、ライブラリを直接使用していないにもかかわらずログに表示される理由を理解しています)。そこでは、彼らは問題を居眠りモードにも関連付けています。しかし、そこにもこの問題の解決策はありません。okhttp
okhttp
okhttp