WebView 캐싱 문제


이 섹션 소개:

요즘에는 Huxiu, ifanr, Titanium Media 및 기타 앱과 같은 포털 정보 웹 사이트가 많이 있습니다. 쉽게 말하면 정보 읽기 앱입니다. 이들은 모두 WebView 캐시를 포함할 수 있는 관련 정보를 표시하기 위해 WebView를 직접 중첩합니다!

소위 페이지 캐싱 이는 인터넷이 없거나 인터넷이 없을 때 웹페이지를 로드할 때 필요한 HTML, JS, CSS 및 기타 페이지 관련 데이터와 기타 리소스를 저장하는 것을 의미합니다. 네트워크 상태가 좋지 않을 때 로컬에 저장된 관련 데이터를 불러오세요! 이 캐시를 구현하는 방법에는 두 가지가 있습니다. 하나는 백그라운드에서 캐시를 작성하는 것입니다. 다운로드된 서비스는 사용자의 필요에 따라 기사 관련 데이터를 데이터베이스에 다운로드하거나 해당 폴더에 저장한 후 다음에 로드합니다. URL에 대응하기 전에 먼저 로컬 캐시가 있는지 확인하고, 로컬 캐시가 있으면 먼저 로컬 캐시를 로드하여 네트워크 요청과 캐시를 동시에 실행합니다. 관련 리소스, 일반적으로 36Kr의 이전 버전은 입력 후 기사가 먼저 오프라인 상태가 된 다음 표시됩니다!

물론, 이 섹션에서 설명할 내용은 로직을 직접 작성하는 이 방법은 WebView 자체의 캐싱 기능을 사용하여 페이지를 캐시하는 방법입니다. 간단합니다. WebView 설정에 대한 관련 기능을 활성화하고 데이터베이스의 캐시 경로를 설정하기만 하면 캐시가 완료됩니다! 특정한 하나씩 구현해 볼까요~


1. 캐시의 분류:

먼저 말씀드릴 것은 캐시의 분류는 페이지 캐시와 데이터 캐시

  • 입니다. 페이지 캐시: 웹 페이지, HTML, JS, CSS 및 기타 페이지 또는 리소스 데이터를 로드할 때 이러한 캐시 리소스는 브라우저로 인해 발생합니다. 브라우저의 동작에 의해 생성된 개발자는 브라우저의 동작에 영향을 미치도록 HTTP 응답 헤더를 구성하여 이러한 캐시된 데이터에 간접적으로만 영향을 미칠 수 있습니다. 캐시된 인덱스는 다음 위치에 있습니다:/data/data/<패키지 이름>/databases해당 파일은 다음 위치에 있습니다:/data/data/package_name/cache/webviewCacheChromunm

  • data 캐시: AppCache와 DOM Storage 두 가지 유형으로 구분 우리 개발자가 스스로 제어할 수 있는 것은 이러한 캐시 리소스입니다.

  • AppCache: 페이지, 이미지, 스크립트, CSS 등 웹 브라우저의 모든 것을 선택적으로 캐시할 수 있습니다. 이는 웹사이트의 여러 페이지에 적용되는 CSS 및 JavaScript 파일의 경우 특히 유용합니다. 현재 크기는 일반적으로 5M입니다. Android에서는 수동으로 켜고(setAppCacheEnabled) 경로(setAppCachePath)와 용량을 설정해야 합니다. (setAppCacheMaxSize)이며 Android는 ApplicationCache.db를 사용하여 AppCache 데이터를 저장합니다!

  • DOM Storage: 키/값 쌍을 사용하여 해결할 수 있는 간단한 데이터를 저장하며, 범위에 따라 Session이 있습니다. 저장소와 로컬 저장소에는 두 가지 유형이 있으며, 각각 세션 수준 저장소(페이지를 닫으면 페이지가 사라짐)와 지역화된 저장소(활성화되지 않는 한)에 사용됩니다. 삭제하세요. 그렇지 않으면 데이터가 만료되지 않습니다.) Android에서 DOM 저장소(setDomStorageEnabled)를 수동으로 켤 수 있습니다. 저장소 경로 설정(setDatabasePath) Android의 Webkit은 DOMStorage에 대한 두 개의 파일(my_path/localstorage/http_blog.csdn.net_0.localstorage 및 my_path/Databases.db)을 생성합니다

좋아요, 위 내용을 읽은 후 다음을 수행하시겠습니까? 그냥 말해두자면, 젠장, 뭐야, 너무 복잡해 보이는데1.jpg물론, 외우지 마세요. 이런 것도 있다는 걸 알아두면 좋고, 실제 개발할 때 좀 더 알아보도록 하겠습니다. 그리고 우리는 일반적으로 어떻게 사용하는지에만 관심을 갖습니다. WebView 캐시 설정 및 캐시 삭제 방법! 아래에 작성한 데모를 실행한 후 파일 구조를 살펴보고 DDMS의 파일 탐색기를 열 수 있습니다.

2.png

헤헤, 한 눈에 알겠군요~그나저나 얘기도 좀 해야 겠네요 여러 캐싱 모드에 대해:

  • LOAD_CACHE_ONLY: 네트워크를 사용하지 않고 로컬 캐시 데이터만 읽습니다.
  • LOAD_DEFAULT: 캐시 제어를 기반으로 네트워크에서 데이터를 가져올지 여부를 결정합니다.
  • LOAD_CACHE_NORMAL: API 레벨 17에서 더 이상 사용되지 않으며 API 레벨 11부터 시작하는 LOAD_DEFAULT 모드와 동일하게 작동합니다.
  • LOAD_NO_CACHE: 캐시를 사용하지 않고 네트워크에서 데이터만 가져옵니다.
  • LOAD_CACHE_ELSE_NETWORK. , 언제까지나 로컬에서 사용할 수 있으므로 로컬에서 사용할 수 있는지 여부에 관계없이 만료되거나 캐시가 없으면 캐시의 데이터를 사용합니다.

요약: 위의 두 가지 모드를 바탕으로 권장되는 캐시 전략은 네트워크가 있는지 판단하고, 네트워크가 있다면 LOAD_DEFAULT를 사용하고, 네트워크가 없는 경우 LOAD_CACHE_ELSE_NETWORK를 사용하세요.

다음은 쌓이는 시간이에요!


2. WebView에 대한 캐싱 기능 켜기

먼저 구현 렌더링을 살펴보겠습니다.

렌더링 실행:

3.gif

프로세스 분석 : 1. 페이지에 들어가면 기본적으로 URL이 로드되며, 링크를 클릭하면 두 번째 페이지로 이동하고 앱을 종료합니다. 2. Wi-Fi와 모바일 네트워크를 끄고 다시 접속해 보세요. 네트워크가 없어도 페이지가 계속 로드되는 것으로 확인됩니다. 첫 번째 링크를 열어도 로딩이 되지만, 다른 링크를 열면 해당 웹페이지를 찾을 수 없는 현상이 발생합니다! 3. 클릭하여 캐시를 지우고 애플리케이션을 닫은 후 다시 입력하면 페이지를 열 수 없습니다!

다음 단계는 코드 구현입니다. MainActivity.java:

public class MainActivity extends AppCompatActivity {

    private WebView wView;
    private Button btn_clear_cache;
    private Button btn_refresh;
    private static final String APP_CACHE_DIRNAME = "/webcache"; // web缓存目录
    private static final String URL = "http://blog.csdn.net/coder_pig";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        wView = (WebView) findViewById(R.id.wView);
        btn_clear_cache = (Button) findViewById(R.id.btn_clear_cache);
        btn_refresh = (Button) findViewById(R.id.btn_refresh);
        wView.loadUrl(URL);
        wView.setWebViewClient(new WebViewClient() {
            //设置在webView点击打开的新网页在当前界面显示,而不跳转到新的浏览器中
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });
        WebSettings settings = wView.getSettings();
        settings.setJavaScriptEnabled(true);
        //设置缓存模式
        settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        // 开启DOM storage API 功能
        settings.setDomStorageEnabled(true);
        // 开启database storage API功能
        settings.setDatabaseEnabled(true);
        String cacheDirPath = getFilesDir().getAbsolutePath() + APP_CACHE_DIRNAME;
        Log.i("cachePath", cacheDirPath);
        // 设置数据库缓存路径
        settings.setAppCachePath(cacheDirPath);
        settings.setAppCacheEnabled(true);
        Log.i("databasepath", settings.getDatabasePath());

        btn_clear_cache.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                wView.clearCache(true);
            }
        });

        btn_refresh.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                wView.reload();
            }
        });
    }

    //重写回退按钮的点击事件
    @Override
    public void onBackPressed() {
        if(wView.canGoBack()){
            wView.goBack();
        }else{
            super.onBackPressed();
        }
    }
}

코드는 매우 간단합니다. 캐시 기능을 활성화하고 캐시 모드와 캐시된 데이터의 경로를 설정하는 것뿐입니다.


3. WebView의 캐시된 데이터 삭제

위의 예에서는 WebView의clearCache(true) 메소드를 호출하여 캐시를 삭제했습니다! 이 방법 외에도 다음과 같은 방법이 있습니다:

  • setting.setCacheMode(WebSettings.LOAD_NO_CACHE);
  • deleteDatabase("WebView.db") 및 deleteDatabase("WebViewCache.db");
  • webView.clearHistory();
  • webView.clearFormData();
  • getCacheDir().delete();
  • 수동으로 삭제 메소드를 작성하고 캐시 폴더를 반복적으로 삭제해 보세요!

물론 앞서 언급했듯이 우리가 직접 조작할 수 있는 것은 데이터 부분뿐이고, 페이지 캐싱은 브라우저에 의한 것입니다 브라우저의 동작에 의해 생성되는 HTTP 응답 헤더를 구성하여 브라우저의 동작에 간접적으로만 영향을 미칠 수 있습니다. 이러한 캐시 데이터. 따라서 위의 방법은 데이터 부분의 캐시만 삭제합니다!


4. 샘플 코드 다운로드:

WebViewDemo7.zip: WebViewDemo7.zip


5 다운로드 WebView에 대한 캐싱을 활성화하는 방법을 작성했습니다. 캐시 삭제는 물론이고 앞으로 마주치면 천천히 찾아보도록 할게요~ 이미지는 이렇습니다~ 감사합니다

그런데 참고링크 올리는 걸 깜빡할뻔했어요 이 섹션의 경우: 4.gif

Android webView 캐시 캐시 + HTML5 오프라인 기능 솔루션

Android 레코드 25-WebView는 오프라인 캐시 읽기를 구현합니다.

Android Clear WebView 캐시