2011-02-07 14 views
0

私は、Androidアプリケーションでいくつかのネイティブ作業を行うためにwindow.locationの変更をインターセプトしようとしています。より具体的なVEのために、私はWebViewClientに呼び出しを上書き:window.locationがあまりにも頻繁に呼び出されましたか?

public boolean shouldOverrideUrlLoading(WebView view, String url) 

で始まるものを探すために、「ネイティブ://」。 JavaScriptコードはこのようなものです。

function callNative() { 
    window.location = "native://doSomeNativeWork()"; 
} 

function callNativeManyTimes(count) { 
    for(i = 0 ; i < count ; i ++) { 
     callNative(); 
    } 
} 

<a href="javascript:callNativeManyTimes(40);" class="btn large">DoSomeNativeWork</a><br/> 

私は見ています問題は、私は「window.locationの=何か」(上記のコードのように)非常に迅速に多くの時間を呼び出す場合、私は唯一のネイティブコード側のWebViewClient内の1つのコールを取得することです。私が50ms離れて電話すると、私はそれらのすべてを得るでしょう。私は、ブラウザがこれを中心にいくつかの最適化を行っていると思っています。

私はこのようにこの問題を解決できると思います:window.locationを使用せず、ネイティブオブジェクトをjavascriptに埋め込み、そのオブジェクトのメソッドをjavascriptで呼び出します。なぜ私はこれが起こっているのだろうかと思っています。いくつかの洞察を共有するために、誰かがもっと慣れ親しんだJSを使うことができます

おかげ

+0

「私が50ms離れて電話すると、私は彼らの誰もが欲しい」あなたは50ms離れて通話をどうやって作るのですか? window.setInterval経由でcallNative()呼び出しをsetIntervalによって呼び出されるコードに入れますか? –

+0

setTimeout( "callNative"、50 * i) – dongshengcn

+0

あなたはwindow.location.href = "..."を実行しようとするかもしれませんが、これはやや奇妙な方法です。たぶん、そのようなURLで画像を作成するのでしょうか? – kirilloid

答えて

1

私は(URLが解決されるまで、おそらく、スクリプトの実行をブロックすることは悪い考えだろう)URLをロードすることは非同期であることを推測します。したがって、window.locationを設定すると、おそらく新しいURLの読み込みがキューに入れられます。これは別のスレッドで行われます。

待機中50msは、動作しているかどうかわからないハックです。あなたは別のアプローチを見つける必要があります。それらのURLのそれぞれが解決されることを保証するものが必要です。順序が重要でない場合は、誰かが提案したようなイメージを使うことができます。それ以外の場合は、ネイティブのJavaScriptインターフェイスを使用することもできます(おそらくこれが良い方法です)。

+0

あなたは絶対に正しいです、場所を変更することはこの種の仕事のためではありません。私は実際に別のアプローチを取っています。私はその質問を投稿して、最適化ブラウザが行っていることについての議論を開始しました。 – dongshengcn

+0

これは最適化ではなく、単なるプロセスです。つまり、JavaScriptは場所の変更を要求しますが、別のスレッドが実際にこの変更を実行します。他のスレッドが変更を行うまでに、JavaScriptスレッドはすでに 'count'回の位置を設定していました。 – EboMike

2

全く同じ問題がありました。あなたはiframeを作成することでそれを行うことができます。ネイティブURLでiframeを作成してから、2秒後にiframeを削除するだけで、あまりにも多くのDOMを置く必要はありません。私の魅力のように働いた。必要な数のiframeを作成できます。

iframe urlにはキャッシュバスターも含まれていますが、必要がないかどうかわかりませんがより良い安全なごめんなさい。

function callNative(url){ 
    var _frame = document.createElement('iframe'); 
    _frame.width=0; _frame.height=0;_frame.frameBorder=0; 
    document.body.appendChild(_frame); 
    if (url.indexOf('?') >= 0){ 
     url = url + "&cb="; 
    }else{ 
     url = url + "?cb="; 
    } 
    _frame.src = url + Math.round(Math.random()*1e16); 
    // Remove the iframe 
    setTimeout(function(){document.body.removeChild(_frame);}, 2000); 
} 

function callNativeManyTimes(count) { 
    for(i = 0 ; i < count ; i ++) { 
     callNative('native://doSomeNativeWork()'); 
    } 
} 

<a href="javascript:callNativeManyTimes(40);" class="btn large">DoSomeNativeWork</a><br/> 

私はiOSの上で上記のアプローチを使用注意。それがAndroidでまったく同じであるかどうかはわかりませんが、質問とそれ以外の回答を判断することから、私は同じものだと思います。

+0

アンドロイドを確認し、iframeを追加するとshouldOverrideUrlLoadingメソッドがトリガーされます – Boris

関連する問題