2

CalledFromWrongThreadSamsung Galaxy S1 (api v7 - android 2.1) で例外クラッシュが発生するライブラリを開発しています。コードは次のようなものです。

class MyWebViewClient extends WebViewClient {
    @Override
    public void shouldOverrideUrlLoading(WebView view, String url) {
        someListener.addToUiView();
    }
}

そしてもちろん、実際にエラーをスローしているメソッド (リスナー コールバックを実装):

View v;
public void addToUiView(){
    v.addView(new TextView(context)); //<-- this line is throwing the error on rare occasions
}

途中でいくつかのコードをスキップしていますが、他の場所で奇妙なことはしていません。また、注意してください: このクラッシュは、ごくわずかな時間で発生しているようです。(全員がデータを報告しているわけではないため、必ずしも決定的なものではありません)。

他の誰かがこれに出くわしましたか?? WebCore のスレッド化は問題を引き起こしていますか?

4

1 に答える 1

2

現在、これを実際にテストしていませんが、私の知る限りでお答えします。WebViewとは言うものの、 (ブラウザ) からの Web リクエストはさまざまなレベルの非同期性で発生し、おそらくこれを達成するためにスレッド プールを利用するため、エラーが断続的にしか表示されないことが私の本能でわかります。基本的に、リソースを並行して要求する場合とそうでない場合があります。さらに悪いことに、OEMWebViewは好みや意見 (特に Samsung) に基づいて OS レベルのコード (内部など) を最適化するため、このエラーが 1 つのデバイスでのみ表示される可能性があります。いずれにせよ、本当の問題は、「UI フレンドリー」であることが確実に保証されていない場所で「UI 関連」の何かを行っていることです...つまり、サブシステムのコールバックを取得している場所です。

あなたの問題の解決策は、説明よりもはるかに簡単です.あなたのcontext(私が仮定しているのはActivity..

ActivityrunOnUiThread(Runnable)s には、ランナブル内のコードが間違ったスレッドで実行されるのを防ぐために呼び出される組み込み関数があります。基本的に、あなたの問題は本当に一般的であり、アンドロイドには組み込みのソリューションがあります。 runOnUiThread必要な場合にのみオーバーヘッドが追加されます。つまり、スレッドが UI スレッドの場合は を実行しRunnable、そうでない場合は正しいHandler(UI スレッドに関連付けられたもの) を使用して を実行しRunnableます。

これは次のようになります。

View v;
public void addToUiView() {

    final Activity activity = (Activity) context;

    activity.runOnUiThread(new Runnable() {

        @Override
        public void run() {

            v.addView(new TextView(activity));
        }

    });
}

私はそれをSOウィンドウ内にコーディングしたので、重大なエラーについてお詫び申し上げます。それがお役に立てば幸いです。さらに情報が必要な場合、またはこれで問題が解決しない場合はお知らせください

于 2013-08-26T13:59:06.127 に答える