অ্যান্ড্রয়েড ওয়েবভিউ - সম্পূর্ণরূপে ক্যাশে সাফ করুন


111

আমার এক ক্রিয়াকলাপে আমার একটি ওয়েবভিউ রয়েছে এবং এটি কোনও ওয়েবপৃষ্ঠা লোড করার পরে পৃষ্ঠাটি ফেসবুকের কিছু পটভূমি ডেটা সংগ্রহ করে।

আমি যা দেখছি তা হ'ল, অ্যাপ্লিকেশনটিতে প্রদর্শিত পৃষ্ঠাটি প্রতিবার অ্যাপ্লিকেশনটি খোলা এবং রিফ্রেশ করার সময় একই হয়।

আমি ক্যাচ ব্যবহার না করার জন্য এবং ওয়েবভিউয়ের ক্যাশে এবং ইতিহাস সাফ করার জন্য ওয়েবভিউকে সেট করার চেষ্টা করেছি।

আমি এখানে পরামর্শটিও অনুসরণ করেছি: কীভাবে ওয়েবভিউয়ের জন্য ক্যাশে খালি করবেন?

তবে এর কোনওটিই কাজ করে না, কারও কি আমার কোনও ধারণা আছে যে এই সমস্যাটি কাটিয়ে উঠতে পারে কারণ এটি আমার আবেদনের একটি গুরুত্বপূর্ণ অঙ্গ।

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

তবে এটি এখনও পৃষ্ঠাটি কী প্রদর্শিত হচ্ছে তা পরিবর্তিত হয়নি। আমার ডেস্কটপ ব্রাউজারে আমি ওয়েবভিউতে উত্পাদিত ওয়েব পৃষ্ঠায় বিভিন্ন এইচটিএমএল কোড পাচ্ছি যাতে আমি জানি যে ওয়েবভিউ অবশ্যই কোথাও ক্যাশে হচ্ছে।

আইআরসি চ্যানেলে আমাকে ইউআরএল সংযোগ থেকে ক্যাচিং সরিয়ে ফিক্সের দিকে নির্দেশ করা হয়েছিল তবে কীভাবে এটি এখনও ওয়েবভিউতে প্রয়োগ করা যায় তা দেখতে পাচ্ছি না।

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

আমি যদি আমার অ্যাপ্লিকেশনটি মুছে ফেলি এবং এটি পুনরায় ইনস্টল করি তবে আমি ওয়েবপৃষ্ঠাটি আপ টু ডেট পেতে পারি, অর্থাত্ একটি নন-ক্যাশেড সংস্করণ। মূল সমস্যাটি হ'ল ওয়েবপৃষ্ঠায় লিঙ্কগুলিতে পরিবর্তনগুলি করা হয়, সুতরাং ওয়েবপৃষ্ঠার সামনের প্রান্তটি সম্পূর্ণ অপরিবর্তিত।


1
mWebView.getSettings().setAppCacheEnabled(false);কাজ হয়নি?
পল

উত্তর:


45

গ্যান্ট ফেস দ্বারা পোস্ট করা উপরে সম্পাদিত কোড স্নিপেটে একটি ত্রুটি রয়েছে যা যদি কোনও ডিরেক্টরি মুছে ফেলতে ব্যর্থ হয় কারণ এর একটি ফাইল মুছে ফেলা যায় না, কোড অসীম লুপে পুনরায় চেষ্টা করতে থাকবে। আমি এটি সত্যিকারের পুনরাবৃত্তির জন্য পুনরায় লিখেছি এবং একটি নামডেস প্যারামিটার যুক্ত করেছি যাতে আপনি কেটে নেওয়া ফাইলগুলি কত পুরানো হতে হবে তা নিয়ন্ত্রণ করতে পারেন:

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

আশা করি অন্যান্য লোকদের ব্যবহারের :)


অনেক ধন্যবাদ! আপনি ছেলেরা আমার দিন বাঁচিয়েছেন :)
ক্রিস

দুর্দান্ত রুটিন, আমাদের অনেক যন্ত্রণা বাঁচিয়েছিল।
মিঃ এড

আমার ফোনে ইনস্টল হওয়া নির্দিষ্ট অ্যাপের জন্য ক্যাশে সাফ করার জন্য আমি কি এই কোডটি কোনও অ্যাপের মধ্যে ব্যবহার করতে পারি?
Si8

পুরো ডিরেক্টরিটি মুছে ফেলার প্রয়োজন হলে রানটাইম.জেটআরটাইম () না করা হবে exec সহজ হতে?
উত্স.রার

@ উত্স.রআর হ্যাঁ, তবে তারপরে আপনার x x দিনের পুরানো ফাইল রাখার ক্ষমতা নেই, যা সাধারণত আপনি ক্যাশে ফোল্ডারটি চান।
চিহ্নজান

205

আমি ক্যাশে সাফ করার একটি এমনকি মার্জিত এবং সহজ সমাধান পেয়েছি

WebView obj;
obj.clearCache(true);

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

আমি ক্যাশে সাফ করার উপায়টি বের করার চেষ্টা করেছি, তবে উপরের উল্লিখিত পদ্ধতিগুলি থেকে আমরা যা করতে পেরেছি তা হ'ল স্থানীয় ফাইলগুলি সরিয়ে ফেলা, তবে এটি কখনই র‌্যাম পরিষ্কার করে না।

এপিআই ক্লিয়ারচে, ওয়েব ভিউ দ্বারা ব্যবহৃত র‌্যামকে মুক্ত করে এবং তাই ওয়েবপৃষ্ঠাটি আবার লোড হওয়ার নির্দেশ দেয়।


11
এখানে সেরা উত্তর।
ব্যবহারকারী 486134

সেরা উত্তর এবং আমি অবাক হয়েছি কেন এটি গ্রহণ করা হয়নি..কুডস অক্ষত :)
কার্তিক

1
আমার জন্য ভাগ্য নেই। ভাবছেন কিছু বদলেছে কি? আমি google.com দিয়ে একটি ওয়েবভিউ লোড করতে পারি এবং ওয়েবভিউ এখনও মনে করে যে আমি লগ ইন করেছি, ক্লিয়ারচে (সত্য) পরেও;
ট্রান্সলেশন

2
@lostintranslation এর জন্য আপনি সম্ভবত কুকি মুছতে চান। যদিও আমি নিশ্চিত যে আপনি এখনই এটি খুঁজে পেয়েছেন।
NineToeNerd

অবজেক্ট বরাদ্দ প্রয়োজন? ওয়েবভিউজ অবজেক্ট = নতুন ওয়েবভিউ (এটি); obj.clearCache (সত্য); যাইহোক, আমার জন্য খুব ভাল, upvated!
জর্জিও বারচিয়েসি

45

আপনি যে সন্ধানটি খুঁজছিলেন তা আমি খুঁজে পেয়েছি:

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

কোনও কারণে অ্যান্ড্রয়েড ইউআরএলটির একটি খারাপ ক্যাশে তৈরি করে যা এটি আপনার প্রয়োজনীয় নতুন ডেটার পরিবর্তে দুর্ঘটনাক্রমে ফিরে আসতে থাকে। অবশ্যই, আপনি কেবল ডিবি থেকে এন্ট্রিগুলি মুছতে পারেন তবে আমার ক্ষেত্রে আমি কেবলমাত্র একটি ইউআরএল অ্যাক্সেস করার চেষ্টা করছি যাতে পুরো ডিবি উড়িয়ে দেওয়া আরও সহজ।

এবং চিন্তা করবেন না, এই ডিবিগুলি কেবলমাত্র আপনার অ্যাপ্লিকেশনের সাথে যুক্ত তাই আপনি পুরো ফোনের ক্যাশে সাফ করছেন না।


ধন্যবাদ, এটি একটি অবিশ্বাস্যভাবে ঝরঝরে কৌশল। এটি আরও ব্যাপকভাবে পরিচিত হওয়ার দাবিদার।
ফিলিপ শিয়ার্ড

2
এটি মৌচাকের মধ্যে একটি বাজে ব্যতিক্রম ছুঁড়ে ফেলেছে: 06-14 22: 33: 34.349: এরর / এসকিউএলডিটিবেস (20382): ডাটাবেস খুলতে ব্যর্থ। এটি বন্ধ। 06-14 22: 33: 34.349: এআরআরআর / এসকিউএলডেটাবেস (20382): অ্যান্ড্রয়েড.ড্যাটাস.সক্লাইট.এসকিউএলডিডিস্কিও এক্সেকশন: ডিস্ক আই / ও ত্রুটি 06-14 22: 33: 34.349: এআরআরআর / এসকিউএলডিটাবেস (20382): এন্ড্রয়েড.ডাটাবেস এ। sqlite.SQLiteDatedia.native_setLocale (নেটিভ পদ্ধতি)
রাফেল

চিয়ার্স রাফায়েল, আমি এটি ভাবতে চাই কারণ হানিকম্বায় মূল সমস্যাটি সমাধান হয়েছে। এই ক্ষেত্রে যদি কেউ কি জানে?
স্কট

কেবল onBackpress () বা পিছনে বোতামে 2 টি লাইন রাখুন কোনও ইতিহাস পিছনে স্ট্যাকের মধ্যে থেকে যায় না কারণ ধন্যবাদ প্রচুর সময় সাশ্রয় হয়।
ক্রেজিমাইন্ড

36

সাইন আউট করার সময় আপনার অ্যাপ্লিকেশনটি তৈরি করার সময় সমস্ত ওয়েবভিউ ক্যাশে সাফ করার জন্য:

CookieSyncManager.createInstance(this);         
CookieManager cookieManager = CookieManager.getInstance();        
cookieManager.removeAllCookie();

ললিপপ এবং উপরের জন্য:

CookieSyncManager.createInstance(this);         
CookieManager cookieManager = CookieManager.getInstance();        
cookieManager.removeAllCookies(ValueCallback);

1
আমার জীবন এবং দিন বাঁচাও।
উদয় নায়ক

2
আপনার ক্রিয়াকলাপে আপনার যদি ওয়েবভিউতে অ্যাক্সেস না থাকে তবে ঠিকঠাক কাজ করে। এটিও নোট করুন যে এই এপিআইটিকে অবমূল্যায়ন করা হয়েছে, সুতরাং এল + ডিভাইসগুলির পরিবর্তে "মুছে ফেলা সমস্ত কুকিজ (মানক্যালব্যাক)" এপিআই ব্যবহার করুন।
অক্ষত

ভ্যালুক্যালব্যাকের সাথে আমার কী প্রতিস্থাপন করা উচিত?
কায়সার খান বঙ্গশ

@ কায়সারখানবাঙ্গাস নতুন ভ্যালু ক্যালব্যাক <বুলিয়ান> () {at ওভাররাইড পাবলিক শূন্য অন রিসিভভ্যালু (বুলিয়ান মান)}}}
অমলবিট

3

এটি আপনার অ্যাপ্লিকেশন ক্যাশেটি পরিষ্কার করতে হবে যা আপনার ওয়েবভিউ ক্যাশেটি যেখানে হওয়া উচিত

File dir = getActivity().getCacheDir();

if (dir != null && dir.isDirectory()) {
    try {
        File[] children = dir.listFiles();
        if (children.length > 0) {
            for (int i = 0; i < children.length; i++) {
                File[] temp = children[i].listFiles();
                for (int x = 0; x < temp.length; x++) {
                    temp[x].delete();
                }
            }
        }
    } catch (Exception e) {
        Log.e("Cache", "failed cache clean");
    }
}

এটি চেষ্টা করে (সামান্য পরিবর্তিত কোড) এবং এখনও একই ফলাফল পেয়েছে -> উপরে বর্ণিত
ম্যাট গ্যান্ট

3

একমাত্র সমাধান যা আমার পক্ষে কাজ করে

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
    CookieManager.getInstance().removeAllCookies(null);
    CookieManager.getInstance().flush();
} 

2

কোটলিনে কেবল নীচের কোডটি ব্যবহার করা আমার পক্ষে কাজ করে

WebView(applicationContext).clearCache(true)

2

ওয়েবভিউ থেকে কুকি এবং ক্যাশে সাফ করার জন্য,

    // Clear all the Application Cache, Web SQL Database and the HTML5 Web Storage
    WebStorage.getInstance().deleteAllData();

    // Clear all the cookies
    CookieManager.getInstance().removeAllCookies(null);
    CookieManager.getInstance().flush();

    webView.clearCache(true);
    webView.clearFormData();
    webView.clearHistory();
    webView.clearSslPreferences();


0

নিশ্চিত হয়ে নিন যে আপনি ইনপুট ক্ষেত্রে ক্লিক করার সময় ফর্ম ডেটা অটোপপ হিসাবে প্রদর্শিত হবে না তার জন্য নীচের পদ্ধতিটি ব্যবহার করছেন।

getSettings().setSaveFormData(false);

0
CookieSyncManager.createInstance(this);         
CookieManager cookieManager = CookieManager.getInstance();        
cookieManager.removeAllCookie();

0
CookieSyncManager.createInstance(this);    
CookieManager cookieManager = CookieManager.getInstance(); 
cookieManager.removeAllCookie();

এটি আমার ওয়েবভিউতে গুগল অ্যাকাউন্ট সাফ করতে পারে


2
কুকিসিঙ্কম্যানেজার চিত্রিত হয়েছে
বিকাশকারী

-1

ব্যবহারের কেস: আইটেমের তালিকা পুনর্ব্যবহারযোগ্য দৃশ্যে প্রদর্শিত হচ্ছে, যখনই কোনও আইটেম এটি ক্লিক করে পুনর্ব্যবহারকারী দৃশ্যটি আড়াল করে আইটেম url সহ ওয়েব ভিউ দেখায় shows

সমস্যা: আমি একবার আমি একটি খোলা যা একই সমস্যা আছে url_oneWebView করুন, তারপরে অন্য খোলার চেষ্টা url_twoWebView, এটা দেখায় url_oneযে পটভূমি পর্যন্ত url_twoলোড করা হয়।

সমাধান: তাহলে আমি কি করেনি সমাধানের ভার ফাঁকা স্ট্রিং ""হিসেবে urlশুধু গোপন সামনে url_oneএবং লোডিং url_two

আউটপুট: আমি যখনই ওয়েবউভিউতে কোনও নতুন ইউআরএল লোড করি এটি ব্যাকগ্রাউন্ডে অন্য কোনও ওয়েব পৃষ্ঠা প্রদর্শন করে না।

কোড

public void showWebView(String url){
        webView.loadUrl(url);
        recyclerView.setVisibility(View.GONE);
        webView.setVisibility(View.VISIBLE);
    }

public void onListItemClick(String url){
   showWebView(url);
}

public void hideWebView(){
        // loading blank url so it overrides last open url
        webView.loadUrl("");
        webView.setVisibility(View.GONE);
        recyclerView.setVisibility(View.GONE);
   }


 @Override
public void onBackPressed() {
    if(webView.getVisibility() == View.VISIBLE){
        hideWebView();
    }else{
        super.onBackPressed();
    }
}

এটি প্রশ্নের সাথে কীভাবে সম্পর্কিত?
জুন

@ জোনকে ভোট দেওয়ার জন্য ধন্যবাদ, এবং আমি প্রতিক্রিয়াটির সত্যই প্রশংসা করি এবং আপনার প্রশ্নের আমার উত্তর হ'ল আমি একই ধরণের দৃশ্যে আটকে আছি, তবে আমার কিছুটা আলাদা আছে, তবে উভয়ের আউটপুট একই, তাই আমার উত্তর লেখার আগে আমি একটি ব্যবহারকারীর কেসও লিখেছি, এটি কুকিজ পরিচালনা করার প্রয়োজন ছাড়াই প্রশ্নে অনুরূপ প্রভাব অর্জন করবে।
অভিষেক গার্গ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.