AsyncTask - android, webview, android-asynctask से वेबव्यू को कैसे अपडेट करें

मेरे पास एक ऐप है जो नेटवर्क से एक एक्सएमएल फ़ाइल प्राप्त करता है, इसे साइट के वेबपृष्ठों पर पथ को पुनः प्राप्त करने के लिए पार्स करता है जिसे मुझे cache.eg करना है

/services/orthopaedics.php

। मैं सफलतापूर्वक सभी के पथ डाउनलोड कर सकता हूंजिन पृष्ठों को कैशिंग की आवश्यकता है। फिलहाल मैं इसे AsyncTask में करता हूं। Webservice कॉल (पृष्ठों के पथ) के परिणाम एक सामग्री में स्टोर हैं AsyncTask के doInBackground विधि में वॉल्यूम। मैं फिर onPostExecute () विधि में इस सामग्री के माध्यम से पुन: प्रयास करता हूं, जहां मैं एक करके वेबपृष्ठों को वेबव्यू के लोड यूआरएल () विधि में लोड कर सकता हूं। यह वेबदृश्य अदृश्य बना दिया गया है क्योंकि इसका उपयोग केवल कैशिंग उद्देश्यों के लिए किया जाता है।

समस्या यह है कि अदृश्य वेबव्यू हैएक और वेबव्यू लोड करना जो उपयोगकर्ता देख सकता है और लोड होने में धीमी साइट के इंडेक्स पेज को प्रदर्शित करना है। अदृश्य वेबव्यू ने कैश लोड करना बंद कर दिया है, तब तक एक सफेद स्क्रीन दिखाई देती है। एक दुश्मन पर लगभग 4 सेकंड लगते हैं जो स्वीकार्य है, लेकिन एक एंड्रॉइड टैबलेट पर लगभग 30 सेकंड लगते हैं।

मुझे पता है कि वेबव्यू पर कॉल यूआई पर होना चाहिएधागा और यही कारण है कि मैं onPostExecute विधि में वेबपृष्ठ (अदृश्य वेबदृश्य) लोड करता हूं। क्या किसी भी तरह से doInBacground विधि में कैश में पृष्ठों को लोड करना संभव होगा, लेकिन runOnUiThread (नया रननेबल) के अंदर webview.loadUrl () रखें?

मैं नीचे जो मतलब है उसका एक सरल नमूना दूंगा।

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



}

उत्तर:

जवाब के लिए 3 № 1

मुझे लगता है कि एकमात्र समाधान है कि अपने डेटा को doInBackground में http अनुरोध के साथ लोड करना है लोड डेटा प्रकाशित प्रगति में।


जवाब के लिए 2 № 2

अफसोस की बात है कि आप एक AsyncTask से एक यूआरएल लोड नहीं कर सकते हैं। सभी "वेब व्यू" विधियों को मुख्य धागे से बुलाया जाना चाहिए।

आप बस एक दूसरे धागे में प्रगति संवाद अद्यतन करने के लिए कर सकते हैं। इस उत्तर की जांच करें Android पर asynctask के साथ वेबव्यू


संबंधित सवाल
सबसे लोकप्रिय