簡體   English   中英

無法在Android 4.4 KitKat上快速關閉ChunkedInputStream

[英]Unable to close ChunkedInputStream quickly on Android 4.4 KitKat

我有一個Android Daydream,使用Twitter4j的流媒體實現顯示一連串的推文。 這適用於Android 4.2和4.3。 但是在4.4上,我無法快速關閉流(在onDreamingStopped )。

我得到這個堆棧跟蹤,NetworkOnMainThreadException不是問題。

連接重用問題似乎與此問題有關。 這個OkHttp變更集在這里合並到Android中)改變了closeChunkedInputStream行為方式。 如果還有更多數據需要讀取,它現在會嘗試丟棄流,而不是簡單地將自己標記為“已關閉”然后斷開套接字,以便能夠快速重用套接字。 如果它無法丟棄流,則會像以前一樣斷開套接字。

我現在得到NetworkOnMainThreadException的原因是(正如您從堆棧跟蹤中看到的那樣)丟棄流現在嘗試從流中讀取。 這很容易修復 - 我只是在關閉我的Daydream時將其放入AsyncTask並忘掉它。

問題是在超時集內沒有丟棄流。 查看最新版本源HttpTransport#discardStream方法 ,它指定套接字上的100ms超時(原始提交指定30ms),然后嘗試從流中讀取( Util.skipAll )以清空緩沖區。 但是我看到BufferedInputStream.read()調用周圍有多秒的延遲。 這種延遲的長度似乎有所不同。

這不是一個大問題 - 因為我現在必須從UI線程關閉此流,我不會導致onDreamingStopped調用需要很長時間才能返回(這導致白日夢留在屏幕上按下/回家后很長一段時間 - 我最初的錯誤報告導致我跟着這個兔子洞。 但是,它確實會在關閉之后將此連接暫停一段時間。

我已經測試了使用兩個不同活動級別的Twitter帳戶關閉流所需的時間。 第一個在我試圖關閉流時沒有看到任何活動,我一直看到通話大約需要30秒。 第二個帳戶有更多的活動,關閉流的時間在這個上更加多變 - 從1.5到30秒不等。 當一條新的推文進入時,它會立即關閉(一個新的塊被寫入流中)。

為什么我在關閉KitKat的流時遇到這種延遲? 為什么它不尊重正在設置的100ms超時?

這類似於Android KitKat HttpURLConnection斷開AsyncTask - 雖然這可能是在引擎蓋下使用FixedLengthInputStream ,但同樣的更改已應用於該類的close方法。

這是OkHttp中的一個錯誤。 修復就在這里 如果您不介意在應用程序中包含OkHttp jar,則可以解決此問題,直到更新AOSP以包含此修復程序。

OkHttpClient okHttpClient = new OkHttpClient();
URL.setURLStreamHandlerFactory(okHttpClient);

OkHttp 1.3沒有及時合並修復程序; 你需要等待以后的發布或自己制作jar

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM