2012年5月24日木曜日

WebViewClientのonPageStartedが二度呼ばれる

AndroidのWebViewClientのonPageStartedが二度呼ばれるという問題に遭遇しました.
URLにアクセスできなかった場合に起きるようです.
バグなのかと思いましたが,仕様のようです.
onPageStartedはWebページの読み込みを開始した時点で呼ばれます.
AというURLにアクセスした時に一回目が呼ばれ,Aにアクセスしようとしたが,接続出来なかった場合のエラーページを読み込み始めた時に二回目が呼ばれるようです.


package se.naru.androd.twiceonpagestarted;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class TwiceOnPageStartedActivity extends Activity {
    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final WebView webView = new WebView(this);
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageStarted(final WebView view, final String url, final Bitmap favicon) {
                System.out.println("called onPageStarted");
            }
        });
        webView.loadUrl("http://sonzaisinaiurl");
        setContentView(webView);
    }
}
これを実行するとこのようなログが得られます.
I/System.out(  325): called onPageStarted
D/dalvikvm(  176): GC_CONCURRENT freed 297K, 52% free 2806K/5767K, external 1625K/2137K, paused 5ms+3ms
D/dalvikvm(  134): GC_EXPLICIT freed 102K, 51% free 2912K/5831K, external 4701K/5604K, paused 54ms
I/System.out(  325): called onPageStarted
そこでonReceivedErrorを使います.これで読み込めなかったことをキャッチします.
package se.naru.androd.twiceonpagestarted;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class TwiceOnPageStartedActivity extends Activity {
    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final WebView webView = new WebView(this);
        webView.setWebViewClient(new WebViewClient() {
            private String mFailingUrl;

            @Override
            public void onPageStarted(final WebView view, final String url, final Bitmap favicon) {
                if (url.equals(mFailingUrl)) {
                    mFailingUrl = null;
                } else {
                    System.out.println("called onPageStarted");
                }
            }

            @Override
            public void onReceivedError(final WebView view, final int errorCode,
                    final String description, final String failingUrl) {
                mFailingUrl = failingUrl;
            }
        });
        webView.loadUrl("http://sonzaisinaiurl");
        setContentView(webView);
    }
}

onPageStartedで特定の処理を行いたいけど,読み込みに失敗した時にその処理が二度走るのは嫌だということがあったので,その時に考えたやりかたです.

0 件のコメント:

コメントを投稿