Android WebView的缓存

发布于 2022-09-30 19:51:39 字数 2419 浏览 38 评论 0

Android WebView的缓存

    各位读者大家好,最近比较忙好久没有写blog了,今天挤点时间和大家分享一下Android中WebView的缓存。我们在项目中也时常会用到 WebView这个控件,当我们加载html时候,会在我们data/应用package下生成database与cache两个文件夹如下图如示:

  我们请求的url记录是保存在webviewCache.db里,而url的内容是保存在webviewCache文件夹下.

  为了让大家更容易理解,我做一个简单的例子,我定义一个html文件,在里面加载了一个淘宝的衣服图片的url,用WebView加载出来,然后再试着从缓存里把这张图片读取出来。

  下面大家可以按照我的步骤一步一步来实践:

  第一步:新建一个Android工程命名为WebViewCacheDemo.目录结构如下:

  第二步:在assets目录下新建一个html文件,命名为index.html,(这里加载了一个淘宝的图片):

  

  第三步:修改main.xml布局文件一个WebView控件一个Button(点击加载缓存图片用),代码如下:

  1.   1. < ?xml version= "1.0" encoding= "utf-8" ?>
  2.   2. < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.   3. android:orientation="vertical"
  4.   4. android:layout_width="fill_parent"
  5.   5. android:layout_height="fill_parent"
  6.   6. >
  7.   7. < WebView
  8.   8. android:id="@+id/webview"
  9.   9. android:layout_width="fill_parent"
  10.   10. android:layout_height="wrap_content"
  11.   11. />
  12.   12. < Button
  13.   13. android:id="@+id/button"
  14.   14. android:layout_width="fill_parent"
  15.   15. android:layout_height="wrap_content"
  16.   16. android:text="从缓存里读取图片"
  17.   17. />
  18.   18. < /LinearLayout>

复制代码Java代码

  1. 1. < ?xml version="1.0" encoding="utf-8"?>
  2.   2. < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.   3. android:orientation="vertical"
  4.   4. android:layout_width="fill_parent"

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦忆晨望 2022-10-07 19:51:39

接上页

  1. 5. android:layout_height="fill_parent"
  2.   6. >
  3.   7. < WebView
  4.   8. android:id="@+id/webview"
  5.   9. android:layout_width="fill_parent"
  6.   10. android:layout_height="wrap_content"
  7.   11. />
  8.   12. < Button
  9.   13. android:id="@+id/button"
  10.   14. android:layout_width="fill_parent"
  11.   15. android:layout_height="wrap_content"
  12.   16. android:text="从缓存里读取图片"
  13.   17. />
  14.   18. < /LinearLayout>

复制代码第四步:修改主核心程序WebViewCacheDemo.java,这里我只加载了index.html文件,按钮事件暂时没写,代码如下:

  1.   1. package com.tutor.webviewcache;
  2.   2. import android.app.Activity;
  3.   3. import android.os.Bundle;
  4.   4. import android.view.View;
  5.   5. import android.view.View.OnClickListener;
  6.   6. import android.webkit.WebView;
  7.   7. import android.widget.Button;
  8.   8. public class WebViewCacheDemo extends Activity {
  9.   9.
  10.   10. private WebView mWebView;
  11.   11. //private Button mButton;
  12.   12. private static final String url = "file:///android_asset/index.html" ;
  13.   13. @Override
  14.   14. public void onCreate(Bundle savedInstanceState) {
  15.   15. super .onCreate(savedInstanceState);
  16.   16. setContentView(R.layout.main);

复制代码

遥远的她 2022-10-07 19:51:39

接上页

  1. 17.
  2.   18. mWebView = (WebView)findViewById(R.id.webview);
  3.   19. mWebView.loadUrl(url);
  4.   20.
  5.   21. // mButton = (Button)findViewById(R.id.button);
  6.   22. // mButton.setOnClickListener(listener);
  7.   23. }
  8.   24. }

复制代码Java代码

  1. 1. package com.tutor.webviewcache;
  2.   2. import android.app.Activity;
  3.   3. import android.os.Bundle;
  4.   4. import android.view.View;
  5.   5. import android.view.View.OnClickListener;
  6.   6. import android.webkit.WebView;
  7.   7. import android.widget.Button;
  8.   8. public class WebViewCacheDemo extends Activity {
  9.   9.
  10.   10. private WebView mWebView;
  11.   11. //private Button mButton;
  12.   12. private static final String url = "file:///android_asset/index.html";
  13.   13. @Override
  14.   14. public void onCreate(Bundle savedInstanceState) {
  15.   15. super.onCreate(savedInstanceState);
  16.   16. setContentView(R.layout.main);
  17.   17.
  18.   18. mWebView = (WebView)findViewById(R.id.webview);
  19.   19. mWebView.loadUrl(url);
  20.   20.
  21.   21. // mButton = (Button)findViewById(R.id.button);
  22.   22. // mButton.setOnClickListener(listener);
  23.   23. }
  24.   24. }
  25. mButton.setOnClickListener(listener); } }

复制代码第五步:在AndroidMainifest.xml文件中加访问网络的权限:

  1.  1. < uses-permission android:name= "android.permission.INTERNET" />

复制代码Java代码

  1. 1. < uses-permission android:name="android.permission.INTERNET" />

复制代码运行效果如下:

  此时我们在WebViewCache.db里的cache.table里多了一条记录如下图所示:

  在cache/webviewCache/目录下多了一个10d8d5cd文件,刚好和cache.table里的filepath,我们可以断定这个文件就是我们从网上拽下来的图片:

  为了验证猜想,我给Button增加事件响应,就是弹出Dialog,里面加载缓存的图片,完整代码如下:

  1.  1. package com.tutor.webviewcache;
  2.   2. import java.io.File;
  3.   3. import java.io.FileInputStream;
  4.   4. import java.io.FileNotFoundException;
  5.   5. import android.app.Activity;
  6.   6. import android.app.Dialog;
  7.   7. import android.graphics.Bitmap;
  8.   8. import android.graphics.BitmapFactory;
  9.   9. import android.os.Bundle;
  10.   10. import android.view.View;
  11.   11. import android.view.View.OnClickListener;
  12.   12. import android.view.ViewGroup.LayoutParams;
  13.   13. import android.webkit.WebView;
  14.   14. import android.widget.Button;
  15.   15. import android.widget.ImageButton;
  16.   16. import android.widget.ImageView;
  17.   17. public class WebViewCacheDemo extends Activity {
  18.   18.
  19.   19. private WebView mWebView;
  20.   20. private Button mButton;
  21.   21. private static final String url = "file:///android_asset/index.html" ;
  22.   22. @Override
  23.   23. public void onCreate(Bundle savedInstanceState) {
  24.   24. super .onCreate(savedInstanceState);
  25.   25. setContentView(R.layout.main);
  26. 26.
  27.   27. mWebView = (WebView)findViewById(R.id.webview);
  28.   28. mWebView.loadUrl(url);
  29.   29.
  30.   30. mButton = (Button)findViewById(R.id.button);
  31.   31. mButton.setOnClickListener(listener);
  32.   32. }
  33.   33.
  34.   34. //button点击事件
  35.   35. OnClickListener listener = new Button.OnClickListener(){
  36.   36. @Override
  37.   37. public void onClick(View v) {
  38.   38. ImageView mImageView = new ImageButton(WebViewCacheDemo. this );
  39.   39. mImageView.setImageBitmap(getPictureFromCache());
  40.   40. Dialog d = new Dialog(WebViewCacheDemo. this );
  41.   41. d.setTitle("从缓存里读取图片" );
  42.   42. d.setContentView(mImageView,
  43.   43. new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
  44.   44. d.show();
  45.   45. }
  46.   46.
  47.   47. };
  48.   48. //从缓存里读取图片,实际实用中会比这个灵活多,我这里写死了
  49.   49. private Bitmap getPictureFromCache(){
  50.   50. Bitmap bitmap = null ;
  51.   51. File file = new File(getCacheDir()+ "/webviewCache/10d8d5cd" );
  52.   52. try {
  53.   53. FileInputStream is = new FileInputStream(file);
  54.   54. bitmap = BitmapFactory.decodeStream(is);
  55.   55. } catch (FileNotFoundException e) {
  56.   56. e.printStackTrace();
  57.   57. }
  58.   58. return bitmap;
  59.   59. }
  60.   60. }

复制代码Java代码

  1.   1. package com.tutor.webviewcache;
  2.   2. import java.io.File;
  3.   3. import java.io.FileInputStream;
  4.   4. import java.io.FileNotFoundException;
  5.   5. import android.app.Activity;
  6.   6. import android.app.Dialog;
  7.   7. import android.graphics.Bitmap;
  8.   8. import android.graphics.BitmapFactory;
  9.   9. import android.os.Bundle;
  10.   10. import android.view.View;
  11.   11. import android.view.View.OnClickListener;

复制代码

任性一次 2022-10-07 19:51:39
  1.  12. import android.view.ViewGroup.LayoutParams;
  2.   13. import android.webkit.WebView;
  3.   14. import android.widget.Button;
  4.   15. import android.widget.ImageButton;
  5.   16. import android.widget.ImageView;
  6.   17. public class WebViewCacheDemo extends Activity {
  7.   18.
  8.   19. private WebView mWebView;
  9.   20. private Button mButton;
  10.   21. private static final String url = "file:///android_asset/index.html";
  11.   22. @Override
  12.   23. public void onCreate(Bundle savedInstanceState) {
  13.   24. super.onCreate(savedInstanceState);
  14.   25. setContentView(R.layout.main);
  15.   26.
  16.   27. mWebView = (WebView)findViewById(R.id.webview);
  17.   28. mWebView.loadUrl(url);
  18.   29.
  19.   30. mButton = (Button)findViewById(R.id.button);
  20.   31. mButton.setOnClickListener(listener);
  21.   32. }
  22.   33.
  23.   34. //button点击事件
  24.   35. OnClickListener listener = new Button.OnClickListener(){
  25.   36. @Override
  26.   37. public void onClick(View v) {
  27.   38. ImageView mImageView = new ImageButton(WebViewCacheDemo.this);
  28.   39. mImageView.setImageBitmap(getPictureFromCache());
  29.   40. Dialog d = new Dialog(WebViewCacheDemo.this);
  30.   41. d.setTitle("从缓存里读取图片");
  31.   42. d.setContentView(mImageView,
  32.   43. new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
  33.   44. d.show();
  34.   45. }
  35.   46.
  36.   47. };
  37.   48. //从缓存里读取图片,实际实用中会比这个灵活多,我这里写死了
  38.   49. private Bitmap getPictureFromCache(){
  39.   50. Bitmap bitmap = null;
  40.   51. File file = new File(getCacheDir()+"/webviewCache/10d8d5cd");
  41.   52. try {
  42.   53. FileInputStream is = new FileInputStream(file);
  43.   54. bitmap = BitmapFactory.decodeStream(is);
  44.       55. } catch (FileNotFoundException e) {
  45.   56. e.printStackTrace();
  46.   57. }
  47.   58. return bitmap;
  48.   59. }
  49.   60. }

复制代码第六步:再次运行工程,点击button按钮,效果如下图所示:

  OK,验证成功,呵呵,今天只是一个简单的小例子加深大家理解,实际应用肯定比这个复杂的多,希望对大家有所帮助,谢谢!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文