11

さまざまな理由から、runOnUiThread() &の初期化WebViewの実際のインスタンス化が必要です。WebViewのUIスレッドとHTTPスレッドを分けることはできますか?

これは、基本的なHTTP接続もUIスレッド上で行われることを意味しますか?

これが当てはまる場合、WebViewのUIをHTTP接続スレッドから分離することは可能ですか?

可能であれば、これを達成する正しい方法は何ですか?

答えて

11

WebView.loadUrl()でリクエストを開始したと仮定すると、AndroidスレッドがUIスレッドでリモートHTTPリクエストを実行するとは考えにくい非常にです。これはひどいユーザーエクスペリエンスになります。

すぐに、私はデバッガでAndroidアプリケーションを実行しました。基本はWebViewで、デバッガで停止しました。彼らは非常に悪い名前

  • アンドロイドを持って、http3WebViewオブジェクトのためのネットワーク接続を処理していない、その後

    1. からWebViewWorkerThreadWebViewCoreThread場合、またはhttp0

      enter image description here

      :ここで私が見たものです本当にひどく建設されています

    また、スタックオーバーフローの最高評判ユーザーの1人でこの回答を見ると、loadUrl() is asynchronousとなります。デバッガをすばやく実行すると、UIスレッド(別名main)で呼び出されるloadUrl()が、UIスレッドで同期的に処理される接続が速すぎることを示しています。 (私は、私が知っているURLが非常に迅速に提供されないでloadUrl()への呼び出しの前後にブレークポイントを置く)。

    私の答えはです。あなたはすでに完成しています。(ええ!)

  • +0

    私が上書きしたloadUrl()では、実際にはスレッドID( 'android.os.Process.myTid()'を使って)を記録していますが、**まったく同じスレッドですUIの**としてのID。何か不足していますか?実際のHTTPリクエストは 'http0' - ' http3'という名前のスレッドで作られていると言っていますか?これらのHTTPスレッドのアプリケーションで実際のスレッドIDを記録する方法がありますか?ありがとう。 –

    +0

    @BillTheApe、あなたは正しいです。 'loadUrl()'はUIスレッドで呼び出されます。それは予想通りだ。しかし、どうやら(おそらく)起こるのは、Androidの 'loadUrl()'の実装では、URL( 'String'または' URL'オブジェクト)をとり、スレッドセーフなキューに入れます。完了するとすぐに、 'loadUrl()'が完了し、呼び出しスレッド(UIスレッドなど)に制御を返します。次に、別のスレッド(UIスレッドではない)が通過し、スレッドセーフキューからURLを取得し、それを使用してWebサーバーへの接続を開きます。次に、データを取得し、最後に... – Nate

    +0

    ... UIスレッドに、取得したコンテンツを 'WebView'でレンダリングするように通知します。私はこれが**正確に**動作するかどうかはわかりませんが、それはネットワークアクティビティが非UIスレッドで処理される例ですが、あなたの実験ではまだUI上で 'loadUrl()'が呼び出されていることを示しています糸。キーは、 'loadUrl()'が完了するまでに、 'WebView'が実際に画面にレンダリングされたすべてのコンテンツを持っているとは限りません。それは理にかなっていますか? – Nate

    関連する問題