<address id="ttjl9"></address>

      <noframes id="ttjl9"><address id="ttjl9"><nobr id="ttjl9"></nobr></address>
      <form id="ttjl9"></form>
        <em id="ttjl9"><span id="ttjl9"></span></em>
        <address id="ttjl9"></address>

          <noframes id="ttjl9"><form id="ttjl9"></form>

          Bitmap三級緩存 和二次采樣

          2019-7-22    seo達人

          如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

          一.為什么Bitmap三級緩存?
          沒有緩存的弊端 :費流量, 加載速度慢
          加入緩存的優點: 省流量,支持離線瀏覽
          二.原理

          從內存獲取圖片, 如果存在, 則顯示; 如果不存在, 則從SD卡中獲取圖片
          從SD卡中獲取圖片, 如果文件中存在, 顯示, 并且添加到內存中; 否則開啟網絡下載圖片
          從網絡下載圖片, 如果下載成功, 則添加到緩存中, 存入SD卡, 顯示圖片
          三.代碼
          (1)添加讀寫SD卡的權限和網絡權限



          // //Lrucache存儲工具類
          public class LruUtils {
          private LruCache<String,Bitmap> lruCache;
          private long max=Runtime.getRuntime().maxMemory();
          public LruUtils(){
          lruCache=new LruCache<String,Bitmap>((int)max/8){

                  @Override
                  protected int sizeOf(String key, Bitmap value) {
                      return value.getByteCount();
                  }
              };
          }
          public Bitmap getBitmap(String key){
              return lruCache.get(key);
          }
          public void setBitmap(String key,Bitmap bitmap){
              lruCache.put(key,bitmap);
          }
          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          }
          //SD卡工具類
          public class SDUtils {

          public static void setBitmap(String name, Bitmap bitmap) {

              if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                  File file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
                  File file1 = new File(file, name);

                  try {

                      bitmap.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(file1));
                  } catch (FileNotFoundException e) {
                      e.printStackTrace();
                  }
              }
          }
          public static Bitmap getBitmap(String name){

              if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
                  File file=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
                  File file1=new File(file,name);

                  return BitmapFactory.decodeFile(file1.getAbsolutePath());

              }
              return null;
          }

          }
          //網絡

          import android.app.AlertDialog;
          import android.graphics.Bitmap;
          import android.graphics.BitmapFactory;
          import android.os.AsyncTask;

          import java.io.InputStream;
          import java.net.HttpURLConnection;
          import java.net.URL;
          import java.util.concurrent.ExecutionException;

          public class NewUtils {
          public static Bitmap getBitmap(String url) throws ExecutionException, InterruptedException {
          return new MyTask().execute(url).get();
          }
          static class MyTask extends AsyncTask<String,Void,Bitmap>{
          @Override
          protected Bitmap doInBackground(String… strings) {
          String imageUrl = strings[0];
          HttpURLConnection conn = null;
          try {
          URL url = new URL(imageUrl);
          conn = (HttpURLConnection) url.openConnection();
          conn.setReadTimeout(5000);
          conn.setConnectTimeout(5000);
          conn.setRequestMethod(“GET”);
          if (conn.getResponseCode() == 200) {
          InputStream is = conn.getInputStream();
          Bitmap bitmap = BitmapFactory.decodeStream(is);
          return bitmap;
          }
          } catch (Exception e) {
          e.printStackTrace();
          } finally {
          if (conn != null) {
          conn.disconnect();
          }
          }
          return null;
          }
          }

          }
          //使用三個工具類完成Bitmap的三級緩存
          package com.example.administrator.myapplication;

          import android.graphics.Bitmap;
          import android.support.v7.app.AppCompatActivity;
          import android.os.Bundle;
          import android.view.View;
          import android.widget.Button;
          import android.widget.ImageView;
          import android.widget.Toast;

          import java.util.concurrent.ExecutionException;

          public class MainActivity extends AppCompatActivity {
          private ImageView imageView;
          Button button;
          private LruUtils lruUtils= new LruUtils();
          @Override
          protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          button=findViewById(R.id.button);
          imageView=findViewById(R.id.imageview);
          button.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
          Bitmap bitmap=lruUtils.getBitmap(“czn”);
          if (bitmap!=null){
          imageView.setImageBitmap(bitmap);
          Toast.makeText(MainActivity.this, “圖片存內存”, Toast.LENGTH_SHORT).show();
          }else{
          bitmap=SDUtils.getBitmap(“czn.jpg”);
          if (bitmap!=null){
          imageView.setImageBitmap(bitmap);
          Toast.makeText(MainActivity.this, “圖片存SD卡”, Toast.LENGTH_SHORT).show();
          lruUtils.setBitmap(“czn”,bitmap);
          }else{
          try {
          bitmap=NewUtils.getBitmap(“http://pic1.win4000.com/wallpaper/e/50d80458e1373.jpg”);
          if (bitmap!=null){
          imageView.setImageBitmap(bitmap);
          Toast.makeText(MainActivity.this, “圖片存網絡”, Toast.LENGTH_SHORT).show();
          SDUtils.setBitmap(“czn.jpg”,bitmap);
          lruUtils.setBitmap(“czn”,bitmap);
          }else{
          Toast.makeText(MainActivity.this, “沒有找到”, Toast.LENGTH_SHORT).show();
          }

                              } catch (ExecutionException e) {
                                  e.printStackTrace();
                              } catch (InterruptedException e) {
                                  e.printStackTrace();
                              }

                          }
                      }
                  }
              });
          }

          }
          Bitmap二次采樣


          import android.graphics.Bitmap;
          import android.graphics.BitmapFactory;
          import android.os.AsyncTask;
          import android.support.v7.app.AppCompatActivity;
          import android.os.Bundle;
          import android.view.View;
          import android.widget.Button;
          import android.widget.ImageView;

          import java.io.ByteArrayOutputStream;
          import java.io.IOException;
          import java.io.InputStream;
          import java.net.HttpURLConnection;
          import java.net.MalformedURLException;
          import java.net.URL;
          import java.util.concurrent.ExecutionException;

          public class Main2Activity extends AppCompatActivity {
          Button bt;
          ImageView imageView;
          @Override
          protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main2);
          bt=findViewById(R.id.bt);
          imageView=findViewById(R.id.mimage);
          bt.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
          try {
          Bitmap bitmap = new MyTask().execute(“https://cdn.duitang.com/uploads/item/201211/24/20121124230042_Bfhim.jpeg”).get();
          imageView.setImageBitmap(bitmap);
          } catch (InterruptedException e) {
          e.printStackTrace();
          } catch (ExecutionException e) {
          e.printStackTrace();
          }

                  }

              });
          }
          class MyTask extends AsyncTask<String,Object,Bitmap>{

              @Override
              protected Bitmap doInBackground(String... strings) {
                  try {
                      URL url = new URL(strings[0]);
                      HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                      if(urlConnection.getResponseCode()==200){
                          InputStream inputStream = urlConnection.getInputStream();
                          //將inputStream流存儲起來
                          ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                          byte[] bytes = new byte[1024];
                          int len=0;
                          while((len=inputStream.read(bytes))!=-1){
                              byteArrayOutputStream.write(bytes,0,len);
                          }
                          //桶:網絡的圖片都放在數組里面了
                          byte[] data = byteArrayOutputStream.toByteArray();
                          //TODO 1:第一次采樣:只采邊框 計算壓縮比例
                          BitmapFactory.Options options = new BitmapFactory.Options();
                          options.inJustDecodeBounds=true;//設置只采邊框
                          BitmapFactory.decodeByteArray(data,0,data.length,options);//采樣
                          int outWidth = options.outWidth;//獲得原圖的寬
                          int outHeight = options.outHeight;//獲得原圖的高
                          //計算縮放比例
                          int size=1;
                          while(outWidth/size>100||outHeight/size>100){
                              size*=2;
                          }
                          //TODO 2:第二次采樣:按照比例才像素
                          options.inJustDecodeBounds=false;//設置只采邊框為fasle
                          options.inSampleSize=size;//設置縮放比例
                          Bitmap bitmap= BitmapFactory.decodeByteArray(data,0,data.length,options);//采樣
                          return  bitmap;
                      }

                  } catch (MalformedURLException e) {
                      e.printStackTrace();
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
                  return null;
              }
          }
          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、網站建設 平面設計服務。

          日歷

          鏈接

          個人資料

          藍藍設計的小編 http://www.syprn.cn

          存檔

          亚洲va欧美va天堂v国产综合