2010-03-17 43 views
79

Tôi có một WebView trong một trong các Hoạt động của tôi và khi tải trang web, trang thu thập dữ liệu nền từ Facebook.Android Webview - Hoàn toàn xóa bộ nhớ cache

Điều tôi thấy là trang được hiển thị trong ứng dụng giống nhau trên mỗi lần ứng dụng được mở và làm mới.

Tôi đã thử đặt WebView không sử dụng bộ nhớ cache và xóa bộ nhớ cache và lịch sử của WebView.

Tôi cũng đã theo các gợi ý ở đây: How to empty cache for WebView?

Nhưng không ai trong số các công trình này, không ai có bất kỳ ý tưởng của tôi có thể khắc phục vấn đề này bởi vì nó là một phần quan trọng của ứng dụng của tôi.

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

Vì vậy, tôi thực hiện đề nghị đầu tiên (Mặc dù đã thay đổi mã để được đệ quy)

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

Tuy nhiên điều này vẫn chưa thay đổi trang nào được hiển thị. Trên trình duyệt máy tính để bàn của tôi, tôi nhận được mã html khác nhau cho trang web được sản xuất trong WebView vì vậy tôi biết WebView phải được lưu vào bộ nhớ đệm ở đâu đó.

Trên kênh IRC, tôi đã được chỉ định khắc phục để xóa bộ đệm ẩn khỏi kết nối URL nhưng không thể xem cách áp dụng nó cho WebView.

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

Nếu tôi xóa ứng dụng và tôi cài đặt lại nó, tôi có thể nhận được các trang web sao lưu cho đến nay, tức là một phiên bản không được lưu trữ. Vấn đề chính là các thay đổi được thực hiện đối với các liên kết trong trang web, vì vậy giao diện người dùng của trang web hoàn toàn không thay đổi.

+1

'mWebView.getSettings(). SetAppCacheEnabled (false);' không hoạt động? – Paul

Trả lời

39

Đoạn mã được chỉnh sửa ở trên được đăng bởi Gaunt Face có lỗi khi thư mục không xóa vì một trong các tệp của nó không thể bị xóa, mã sẽ tiếp tục thử lại trong vòng lặp vô hạn.Tôi viết lại nó để thực sự đệ quy, và thêm vào một tham số NUMDAYS để bạn có thể kiểm soát cách các tập tin cũ phải được cắt tỉa:

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

Hy vọng sử dụng cho người khác :)

+0

Tìm thấy tốt về lỗi :) –

+0

Cảm ơn rất nhiều! các bạn đã cứu ngày của tôi :) – Kris

+0

Thường lệ tuyệt vời, cứu chúng tôi rất nhiều đau đớn. –

3

này nên xóa bộ nhớ cache ứng dụng của bạn mà nên là nơi bộ nhớ cache webview của bạn là

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

Đã thử điều này (Đã thay đổi mã một chút) và vẫn nhận được kết quả tương tự -> Giải thích ở trên –

+0

hữu ích. !!! :) –

38

tôi thấy việc sửa chữa bạn đang tìm kiếm:

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

Đối với một số lý do Android khiến một bộ nhớ cache xấu của url mà nó liên tục quay trở lại thay vì dữ liệu mới mà bạn cần. Chắc chắn, bạn chỉ có thể xóa các mục từ DB nhưng trong trường hợp của tôi tôi chỉ cố gắng truy cập một URL để thổi đi toàn bộ DB dễ dàng hơn.

Và đừng lo, các DB này chỉ được liên kết với ứng dụng của bạn để bạn không xóa bộ nhớ cache của toàn bộ điện thoại.

+1

Hoàn toàn làm việc cho tôi! :) – Manuel

+0

Cảm ơn, đây là một mẹo cực kỳ gọn gàng. Nó xứng đáng được biết đến rộng rãi hơn. –

+2

Điều này ném một ngoại lệ khó chịu trong tổ ong: 06-14 22: 33: 34.349: ERROR/SQLiteDatabase (20382): Không thể mở cơ sở dữ liệu. đóng nó lại. 06-14 22: 33: 34.349: ERROR/SQLiteDatabase (20382): android.database.sqlite.SQLiteDiskIOException: lỗi I/O đĩa 06-14 22: 33: 34.349: ERROR/SQLiteDatabase (20382): ở android. database.sqlite.SQLiteDatabase.native_setLocale (Native Method) –

150

Tôi tìm thấy một thậm chí giải pháp thanh lịch và đơn giản để bộ nhớ cache thanh toán bù trừ

WebView obj; 
obj.clearCache(true); 

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

tôi đã cố gắng tìm ra cách để xóa bộ nhớ cache, nhưng tất cả chúng ta có thể làm fro m các phương pháp được đề cập ở trên đã được loại bỏ các tập tin địa phương, nhưng nó không bao giờ làm sạch RAM.

API clearCache, giải phóng bộ nhớ RAM được sử dụng bởi chế độ xem web và do đó yêu cầu trang web được tải lại.

+11

Câu trả lời hay nhất ở đây. – user486134

+1

Đây phải là câu trả lời được chấp nhận –

+0

Câu trả lời hay nhất và tôi tự hỏi tại sao nó không được chấp nhận..Kudos Akshat :) – Karthik

0

Đảm bảo bạn sử dụng phương thức dưới đây để dữ liệu biểu mẫu không được hiển thị dưới dạng tự động mở khi được nhấp vào trường nhập.

getSettings().setSaveFormData(false); 
22

Để xóa tất cả các cache webview khi bạn signOUT tạo APP của bạn:

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

Đối với Lollipop trở lên:

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

cứu mạng sống và ngày của tôi. –

+0

Hoạt động tốt nếu bạn không có quyền truy cập vào chế độ xem web trong hoạt động của mình. Cũng lưu ý rằng API này đã không được chấp nhận, do đó, hãy sử dụng API "removeAllCookies (ValueCallback)" thay thế trên các thiết bị L +. – Akshat

Các vấn đề liên quan