1

ネットワークからxmlファイルを取得し、それを解析して、キャッシュする必要があるサイトのWebページへのパスを取得するアプリがあります.eg

/services/orthopaedics.php

. キャッシュが必要なすべてのページのパスを正常にダウンロードできます。現時点では、これを AsyncTask で行います。Web サービス呼び出しの結果 (ページへのパス) は、AsyncTask の doInBackground メソッドの contentsValues に格納されます。次に、onPostExecute() メソッドでこの contentvalues を反復処理します。ここで、webview の loadUrl() メソッドで Web ページを 1 つずつロードできます。この WebView はキャッシュ目的でのみ使用されるため、非表示になります。

問題は、非表示の webview が別の webview を読み込んでいるため、ユーザーが見ることができ、サイトのインデックス ページを表示することで、読み込みが遅くなることです。非表示の WebView がキャッシュの読み込みを停止するまで、白い画面が表示されます。スマートフォンでは許容範囲内の約 4 秒かかりますが、Android タブレットでは約 30 秒かかります。

webview への呼び出しは UI スレッド上にある必要があることを知っています。そのため、onPostExecute メソッドで Web ページ (非表示の webview) をロードします。どうにかしてページを doInBacground メソッドのキャッシュにロードし、webview.loadUrl() を runOnUiThread(new Runnable) 内に配置することは可能でしょうか?

以下に、私が意味することの簡単なサンプルを示します。

private class AsyncCacheSite extends AsyncTask<String, ContentValues, ContentValues>{

        ProgressDialog progressDialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Log.e(TAG, "about to load main page");
            webView.loadUrl(mobileWebsiteUrl, getHeaders());

            progressDialog = new ProgressDialog(MainActivity.this);
            progressDialog.setTitle("Connecting to Server");
            progressDialog.setMessage("Caching website for offline use...");
            progressDialog.setIndeterminate(true);
            progressDialog.show();
        }

        @Override
        protected ContentValues doInBackground(String... params) {
            ContentValues cv = null;

            try {
                //call the service to get the xml file containing paths
                cv = ws.checkForUpdates();


            } catch (Exception e) {
               e.printStackTrace();
            }

//iterate through the xml file geting the paths
.......
.......
.......
runOnUiThread(new Runnable() {

                            @Override
                            public void run() {
                                // TODO Auto-generated method stub
loadUrlIntoCache(page);

                            }
                        })


            return null; 

        }



        @Override
        protected void onPostExecute(ContentValues result) {
            super.onPostExecute(result);



            progressDialog.dismiss();


    }//end of postExecute

 }//end of asyncTask



public void loadUrlIntoCache(String pageUrl){

        WebView wv2 = new WebView(MainActivity.this);

        wv2.getSettings().setSupportZoom(true);
        wv2.getSettings().setBuiltInZoomControls(true);
        wv2.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
        wv2.setScrollbarFadingEnabled(true);
        wv2.getSettings().setLoadsImagesAutomatically(true);
        wv2.getSettings().setDomStorageEnabled(true);
        wv2.getSettings().setAppCacheEnabled(true);
        // Set cache size to 8 mb by default. should be more than enough
        wv2.getSettings().setAppCacheMaxSize(1024*1024*32);
        // This next one is crazy. It's the DEFAULT location for your app's cache
        // But it didn't work for me without this line.
        // UPDATE: no hardcoded path. Thanks to Kevin Hawkins
        String appCachePath = getApplicationContext().getCacheDir().getAbsolutePath();

        wv2.getSettings().setAppCachePath(appCachePath);
        wv2.getSettings().setAllowFileAccess(true);
        wv2.getSettings().setJavaScriptEnabled(true);
       // wv2.setWebViewClient(new WebViewClient());

////////////////////////////////////////////////////////////////////////////////////////
/////the webviewclient below is the code you gave me to overcome the redirecting issue//
////////////////////////////////////////////////////////////////////////////////////////
webView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url){
// do your handling codes here, which url is the requested url
// probably you need to open that url rather than redirect:
view.loadUrl(url);
return false; // then it is not handled by default action
}
});

        wv2.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
        wv2.setVisibility(View.GONE); 

        wv2.loadUrl(mobileWebsiteUrl + pageUrl, getHeaders());
        Log.e(TAG, "loading " + mobileWebsiteUrl + pageUrl);



    }
4

3 に答える 3

3

唯一の解決策は、doInBackground で http リクエストを使用してデータをロードしてから、publishProgress で loadData を使用すること と思います。

于 2013-02-26T18:18:27.780 に答える
2

残念ながら、AsyncTask から URL を「読み込む」ことはできません。すべての「WebView」メソッドは、メイン スレッドから呼び出す必要があります。

できることは、2 番目のスレッドで進行状況ダイアログを更新することだけです。この回答Webview with asynctask on Android を確認してください。

于 2014-10-23T15:59:21.730 に答える