Wie man Webview von AsyncTask aktualisiert - Android, Webview, Android-asynctask

Ich habe eine App, die eine XML-Datei aus dem Netzwerk holt, um sie auf Pfade einer Webseite zu cachen, die ich cachen muss

/services/orthopaedics.php

. Ich kann die Pfade von allen erfolgreich herunterladendie Seiten, die zwischengespeichert werden müssen. Im Moment mache ich das in einer AsyncTask. Die Ergebnisse des Webservice-Aufrufs (Pfade zu Seiten) werden in einem contentsValues ​​in der doInBackground-Methode der AsyncTask gespeichert. Ich durchlaufe dann diese Inhalte in der onPostExecute () Methode, wo ich die Webseiten nacheinander in die loadUrl () Methode einer Webansicht laden kann, diese Webansicht wird unsichtbar gemacht, da sie nur für Cachingzwecke verwendet wird.

Das Problem ist, dass das unsichtbare Webview isteine andere Webansicht laden, die der Benutzer sehen kann und die Indexseite der Seite anzeigen soll, die langsam geladen wird. Ein weißer Bildschirm erscheint, bis der unsichtbare Webview den Cache nicht mehr lädt. Auf einem Foto dauert es etwa 4 Sekunden, was akzeptabel ist, aber auf einem Android-Tablet dauert es etwa 30 Sekunden.

Ich weiß, dass Aufrufe von Webview auf der Benutzeroberfläche sein müssenthread und deshalb lade ich die Webseiten (invisible webview) in der onPostExecute Methode. Wäre es möglich, die Seiten irgendwie in den Cache in der doInBacground-Methode zu laden, aber die webview.loadUrl () in einen runOnUiThread (new Runnable) zu legen?

Ich gebe ein vereinfachtes Beispiel dessen, was ich darunter verstehe.

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);



}

Antworten:

3 für die Antwort № 1

Ich denke, die einzige Lösung ist, laden Sie Ihre Daten mit einer http-Anfrage in doInBackground dann verwenden lade Daten in publishProgress.


2 für die Antwort № 2

Leider kann man eine URL von einer AsyncTask nicht "laden". Alle "WebView" -Methoden müssen aus dem Hauptthread aufgerufen werden.

Sie können den Fortschrittsdialog nur in einem zweiten Thread aktualisieren. Überprüfen Sie diese Antwort Webview mit Asynctask auf Android.


Verwandte Fragen