android - एंड्रॉइड वेबव्यू-पूरी तरह से कैश साफ़ करें



caching webview (5)

इतिहास को साफ़ करने के लिए, बस करें:

this.appView.clearHistory();

स्रोत: http://developer.android.com/reference/android/webkit/WebView.html

https://ffff65535.com

मेरे पास मेरी गतिविधियों में से एक में वेबव्यू है, और जब यह एक वेबपृष्ठ लोड करता है, तो पृष्ठ फेसबुक से कुछ पृष्ठभूमि डेटा एकत्र करता है।

हालांकि, मैं जो देख रहा हूं, वह एप्लिकेशन में प्रदर्शित पृष्ठ है जब ऐप खोला जाता है और ताज़ा किया जाता है।

मैंने वेबव्यू को कैश का उपयोग न करने और वेबव्यू के कैश और इतिहास को साफ़ करने की कोशिश की है।

मैंने यहां सुझाव का भी पालन किया है: WebView के लिए कैश कैसे खाली करें?

लेकिन इनमें से कोई भी काम नहीं करता है, क्या किसी के पास कोई समस्या है कि मैं इस समस्या को दूर कर सकता हूं क्योंकि यह मेरे आवेदन का एक महत्वपूर्ण हिस्सा है।

    mWebView.setWebChromeClient(new WebChromeClient()
    {
           public void onProgressChanged(WebView view, int progress)
           {
               if(progress >= 100)
               {
                   mProgressBar.setVisibility(ProgressBar.INVISIBLE);
               }
               else
               {
                   mProgressBar.setVisibility(ProgressBar.VISIBLE);
               }
           }
    });
    mWebView.setWebViewClient(new SignInFBWebViewClient(mUIHandler));
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.clearHistory();
    mWebView.clearFormData();
    mWebView.clearCache(true);

    WebSettings webSettings = mWebView.getSettings();
    webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);

    Time time = new Time();
    time.setToNow();

    mWebView.loadUrl(mSocialProxy.getSignInURL()+"?time="+time.format("%Y%m%d%H%M%S"));

इसलिए मैंने पहला सुझाव लागू किया (हालांकि कोड को रिकर्सिव करने के लिए बदल दिया गया)

private void clearApplicationCache()
{
    File dir = getCacheDir();

    if(dir!= null && dir.isDirectory())
    {
        try
        {
            ArrayList<File> stack = new ArrayList<File>();

            // Initialise the list
            File[] children = dir.listFiles();
            for(File child:children)
            {
                stack.add(child);
            }

            while(stack.size() > 0)
            {
                Log.v(TAG, LOG_START+"Clearing the stack - " + stack.size());
                File f = stack.get(stack.size() - 1);
                if(f.isDirectory() == true)
                {
                    boolean empty = f.delete();

                    if(empty == false)
                    {
                        File[] files = f.listFiles();
                        if(files.length != 0)
                        {
                            for(File tmp:files)
                            {
                                stack.add(tmp);
                            }
                        }
                    }
                    else
                    {
                        stack.remove(stack.size() - 1);
                    }
                }
                else
                {
                    f.delete();
                    stack.remove(stack.size() - 1);
                }
            }
        }
        catch(Exception e)
        {
            Log.e(TAG, LOG_START+"Failed to clean the cache");
        }
    }
}

हालांकि यह अभी भी नहीं बदला है कि पेज क्या प्रदर्शित कर रहा है। मेरे डेस्कटॉप ब्राउज़र पर मुझे वेबव्यू में उत्पादित वेब पेज पर अलग-अलग HTML कोड मिल रहा है, इसलिए मुझे पता है कि वेब व्यू कहीं कैशिंग होना चाहिए।

आईआरसी चैनल पर मुझे एक यूआरएल कनेक्शन से कैशिंग हटाने के लिए एक फिक्स की ओर इशारा किया गया था, लेकिन यह नहीं देख सकता कि इसे अभी तक वेबव्यू पर कैसे लागू किया जाए।

http://www.androidsnippets.org/snippets/45/

अगर मैं अपना आवेदन हटा देता हूं और इसे पुनः स्थापित करता हूं, तो मैं वेबपृष्ठ को अद्यतित कर सकता हूं, यानी एक गैर-कैश संस्करण। मुख्य समस्या यह है कि वेबपृष्ठ में लिंक के लिए परिवर्तन किए जाते हैं, इसलिए वेबपृष्ठ का फ्रंट एंड पूरी तरह अपरिवर्तित है।


गौंट फेस द्वारा पोस्ट किए गए संपादित कोड स्निपेट में एक त्रुटि है यदि कोई निर्देशिका हटाने में विफल रहता है क्योंकि इसकी फ़ाइलों में से कोई भी हटाया नहीं जा सकता है, तो कोड एक अनंत लूप में पुनः प्रयास जारी रखेगा। मैं इसे वास्तव में रिकर्सिव होने के लिए पुनः लिखता हूं, और एक numDays पैरामीटर जोड़ता हूं ताकि आप नियंत्रित कर सकें कि फ़ाइलों को कितनी पुरानी होनी चाहिए:

//helper method for clearCache() , recursive
//returns number of deleted files
static int clearCacheFolder(final File dir, final int numDays) {

    int deletedFiles = 0;
    if (dir!= null && dir.isDirectory()) {
        try {
            for (File child:dir.listFiles()) {

                //first delete subdirectories recursively
                if (child.isDirectory()) {
                    deletedFiles += clearCacheFolder(child, numDays);
                }

                //then delete the files and subdirectories in this dir
                //only empty directories can be deleted, so subdirs have been done first
                if (child.lastModified() < new Date().getTime() - numDays * DateUtils.DAY_IN_MILLIS) {
                    if (child.delete()) {
                        deletedFiles++;
                    }
                }
            }
        }
        catch(Exception e) {
            Log.e(TAG, String.format("Failed to clean the cache, error %s", e.getMessage()));
        }
    }
    return deletedFiles;
}

/*
 * Delete the files older than numDays days from the application cache
 * 0 means all files.
 */
public static void clearCache(final Context context, final int numDays) {
    Log.i(TAG, String.format("Starting cache prune, deleting files older than %d days", numDays));
    int numDeletedFiles = clearCacheFolder(context.getCacheDir(), numDays);
    Log.i(TAG, String.format("Cache pruning completed, %d files deleted", numDeletedFiles));
}

उम्मीद है कि अन्य लोगों के लिए उपयोग :)


मुझे कैश साफ़ करने के लिए एक सुरुचिपूर्ण और सरल समाधान मिला

WebView obj;
obj.clearCache(true);

http://developer.android.com/reference/android/webkit/WebView.html#clearCache%28boolean%29

मैं कैश को साफ़ करने के तरीके को समझने की कोशिश कर रहा हूं, लेकिन उपर्युक्त विधियों से हम जो भी कर सकते थे, वह स्थानीय फाइलों को हटा देता था, लेकिन यह राम को कभी साफ नहीं करता था।

एपीआई clearCache, वेबव्यू द्वारा उपयोग की जाने वाली रैम को मुक्त करता है और इसलिए यह आदेश देता है कि वेबपृष्ठ दोबारा लोड हो जाए।


मुझे वह फिक्स मिला जो आप ढूंढ रहे थे:

context.deleteDatabase("webview.db");
context.deleteDatabase("webviewCache.db");

किसी कारण से एंड्रॉइड यूआरएल का खराब कैश बनाता है जो आपको आवश्यक नए डेटा की बजाय दुर्घटना से लौटता रहता है। निश्चित रूप से, आप केवल डीबी से प्रविष्टियों को हटा सकते हैं, लेकिन मेरे मामले में मैं केवल एक यूआरएल तक पहुंचने की कोशिश कर रहा हूं ताकि पूरे डीबी को दूर करना आसान हो।

और चिंता न करें, ये डीबी सिर्फ आपके ऐप से जुड़े हुए हैं ताकि आप पूरे फोन के कैश को साफ़ नहीं कर रहे हैं।


सुनिश्चित करें कि आप इनपुट फ़ील्ड पर क्लिक करते समय फॉर्म डेटा को ऑटोपॉप के रूप में प्रदर्शित नहीं किए जाने के लिए नीचे विधि का उपयोग करें।

getSettings().setSaveFormData(false);




webview