0

アプリケーション内で、BrowserField を使用して Web サイトを表示しています。また、サイト内の各リンクが選択されたときに、ユーザーが空白にならないようにロード画面を表示する必要があります。

このメソッド内にロード画面を追加できました

public void documentCreated(BrowserField browserField,
                            ScriptEngine scriptEngine, Document document)

ただし、問題は接続が確立されたときだけで、このメソッドが呼び出されるため、ロード画面が表示されるまでに遅延が発生します。

そこで、ProtocolController を実装して、このメソッド内にロード画面を追加してみました

public void handleNavigationRequest(BrowserFieldRequest request)

それでも、読み込み画面は少し遅れて表示されます (documentCreated メソッドの下にあったときと同じです)。

これは私のコードスニペットです

public void handleNavigationRequest(BrowserFieldRequest request)
            throws Exception {

        if (!NetworkUtil.isNetworkAvailable()) {
            Dialog.inform(Strings.NETWORK_ERROR);
        } else {

            UiApplication.getUiApplication().invokeAndWait(new Runnable() {
                 public void run() {
                     BaseScreen.showLoadingProgress(Strings.LOADING);
                 }
             });

            InputConnection ic = handleResourceRequest(request);
            browserField.displayContent(ic, request.getURL());
        }
    }

スレッドの外でもこれを試しました....それでも同じことが起こっています。テストのために、このメソッド内にダイアログを追加しましたが、サイト内のリンクをクリックすると同時にダイアログが表示されました。このロード画面だけはロードに時間がかかります。

これを実現する方法はありますか?

また、ブラウザー フィールドは、ネイティブ ブラウザーと比較して Web サイトの読み込みに少し時間がかかります。

私はここに何かが欠けています! 助けてください

あなたが提案したように、documentUnloadingメソッドを試しました。しかし、それはトリガーされていません。以下にコード スニペットを示します。ここで何が間違っているかを確認してください...!!

protected void onUiEngineAttached(boolean attached) {
        if (attached) {

            BaseScreen.showLoadingProgress(Strings.LOADING);

        }
        super.onUiEngineAttached(attached);
    }

try {
                listener = new BrowserFieldListener() {

                    // Page starts loading...
                    public void documentCreated(BrowserField browserField,
                            ScriptEngine scriptEngine, Document document)
                             {

                        // show the loading screen
                        //showLoadingProgress(Strings.LOADING);
                    }

                    public void documentError(BrowserField browserField,
                            Document document)  {
                        hideLoadingProgress();
                        Dialog.inform(Strings.NETWORK_ERROR);
                    }

                    public void documentAborted(BrowserField browserField,
                            Document document) { 
                        hideLoadingProgress();
                        Dialog.inform(Strings.NETWORK_ERROR);
                    }

                    public void documentUnloading(BrowserField browserField,
                            Document document) {

                        BaseScreen.showLoadingProgress(Strings.LOADING);
                    }

                    // Page loaded
                    public void documentLoaded(BrowserField browserField,
                            Document document) {

                        // the document has loaded, hide loading popup ...
                        BaseScreen.hideLoadingProgress();
                    }

                };
            } catch (Exception ex) {
                Dialog.inform(Strings.NETWORK_ERROR);
            }

browserField.addListener(listener);
            // add the browser field to a ui manager or screen
            add(browserField);

            // request the content
            browserField.requestContent(URL);
4

1 に答える 1

0

BrowserFieldListener を使用してこれを行います ( BrowserFieldListener.htmlを参照)。少し直感に反しますが、documentUnloading() でローディング画面を表示し、documentLoaded() でそれを削除します。BrowserField に最初にデータを入力するときは、読み込み画面もプッシュし、BrowserField を含む画面が閉じられると、読み込み画面もポップされるようにします。かなりの解決策ではありませんが、私にとってはうまくいきます。

はい、一般的に、BrowserField は Browser よりも低速です。私はそれを回避する方法を見つけていません。ただし、1 つの重要な側面はキャッシュです。BrowserField 用に独自のキャッシュを作成する方法については、こちらを参照してください。ここには Thread があり、BB Web サイトには KB 記事があります。申し訳ありませんが、それらの atm を見つけることができません。見つかったら更新します。

アップデート

OPで見つかったように、キャッシュの記事はこちらです。

更なるアップデート

2つのことを明確にするために:

  1. addListener メソッドを使用して、Listener を BrowserField に関連付ける必要があります。
  2. BrowserField の初期ロードに通常の requestContent() を実行すると仮定すると、呼び出されるリスナーの最初のメソッド (もちろん動作していると仮定) は documentLoaded() になるため、ローディング画面を自分でプッシュする必要があります。

リスナーの使用方法を示すサンプルがここに含まれています: リスナーのサンプル

于 2013-11-21T11:06:10.187 に答える