안드로이드 개발 아트탐구 독서노트 12장 비트맵의 로드와 Cache

4107 단어
12.1 비트맵의 효율적인 로드
  • BitmapFactory 클래스는 네 가지 방법을 제공한다. 그것이 바로 decodeFile, decodeResource, decodeStream과 decodeByteArray이다.그 중에서 decodeFile과 decodeResource는 간접적으로 decodeStream 방법을 호출했다.이 네 가지 방법은 최종적으로 안드로이드 밑바닥에서 실현된다.
  • 비트맵을 효율적으로 로드하는 방법은 무엇입니까?핵심 사상: 수요에 따라 싣기;ImageView는 원본 그림만큼 크지 않기 때문에 원본 크기의 그림을 불러올 필요가 없습니다.BitmapFactory를 사용합니다.Options를 사용하여 원하는 크기의 이미지를 로드합니다.BitmapFactory를 통해Options는 그림을 축소하는데 주로 inSampleSize 매개 변수, 즉 샘플링 확률을 사용합니다.inSampleSize는 2의 지수가 되어야 합니다. 시스템이 아니면 아래로 정렬하고 2에 가장 가까운 지수를 선택합니다.줌 비율은 1/(inSampleSize의 두 번째 방향)입니다.
  • 비트맵 메모리 점용: 102410241024 픽셀의 그림을 가지고 ARGB8888 형식으로 저장한다고 가정하면 1024102410*4, 즉 4MB를 차지한다.
  • 이미지 확대/축소(압축):
  •  public static Bitmap decodeBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) {
            BitmapFactory.Options options = new BitmapFactory.Options();
            //1.  BitmapFactory.Options inJustDecodeBounds     true     。
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeResource(res, resId, options);
    
            //2.              View           inSampleSize。
            options.inSampleSize = calcuateInSampleSize(options, reqWidth, reqHeight);
    
            //3.  BitmapFactory.Options inJustDecodeBounds     false,        。
            options.inJustDecodeBounds = false;
            return BitmapFactory.decodeResource(res, resId, options);
        }
         //     
        private static int calcuateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
            int width = options.outWidth;
            int height = options.outHeight;
            int inSampleSize = 1;
    
            if (height > reqHeight || width > reqWidth) {
                int halfHeight = height / 2;
                int halfWidth = width / 2;
                while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) {
                    inSampleSize *= 2;
                }
            }
            return inSampleSize;
        }
    //     
    Bitmap bitmap = DecodeBitmap.decodeBitmapFromResource(getResources(), R.mipmap.haimei2, 400, 400);
    imageView.setImageBitmap(bitmap);
    

    inJustDecodeBounds 매개 변수가true일 때 BitmapFactory는 그림의 원시 너비/높이 정보만 해석하고 그림을 실제로 불러오지 않습니다.이때 BitmapFactory에서 얻은 그림의 폭/높이 정보와 그림의 위치는 프로그램이 실행하는 장치와 관련이 있음을 주의해야 한다.
    12.2 Android 캐시 정책
  • 어떻게 유량 소모를 줄입니까?캐시프로그램이 처음으로 네트워크에서 그림을 불러온 후에 그것을 저장 장치에 캐시하고 다음에 이 그림을 사용할 때 네트워크에서 가져올 필요가 없다.일반적으로 그림을 메모리에 저장하고 메모리에 저장한다. 메모리에서 찾지 못하면 메모리에서 찾고 찾지 못하면 인터넷에서 다운로드한다.
  • 현재 자주 사용하는 캐시 알고리즘은 LRU로 최근에 가장 적게 사용하는 알고리즘이고 캐시가 가득 차면 최근에 가장 적게 사용하는 캐시 대상을 우선적으로 제거한다.LRU 알고리즘을 사용하는 캐시는 LRUCache(메모리 캐시)와 DiskLruCache(메모리 캐시) 두 가지가 있다.
  • LruCache는 안드로이드 3.1 지원하는 캐시 클래스입니다. support-v4 호환 패키지를 통해 초기 안드로이드 버전과 호환됩니다.LruCache는 일반적인 클래스로 라인이 안전합니다. 내부는 링크드 HashMap으로 외부 캐시 대상을 강제로 저장하고 get과put 방법을 제공하여 캐시를 가져오고 추가합니다. 캐시가 가득 차면 LruCache는 비교적 일찍 사용된 캐시 대상을 제거합니다.LruCache를 초기화할 때 캐시 대상의 크기를 계산하기 위해 sizeof 방법을 다시 써야 합니다.
  • 강 인용: 직접적인 대상 인용
  • 소프트 인용: 한 대상이 소프트 인용만 존재할 때 시스템 메모리가 부족할 때 이 대상은 GC에서 회수됩니다.
  • 약인용: 한 대상이 약인용만 존재할 때 이 대상은 수시로 GC에 회수된다.
  • DiskLruCache는 디스크 캐시를 실현하는 데 사용되며, DiskLruCache는 안드로이드 공식 문서에서 추천받았지만, 안드로이드 SDK의 일부 원본에 속하지 않습니다
  • 자체 ImageLoader 구현
  • 이미지 압축 기능
  • 메모리 및 디스크 캐시
  • 동시 로드와 비동기 로드의 인터페이스 설계
  • 주석의 수첩 코드를 자세히 보십시오
    12.3 ImageLoader 사용
  • 사진 벽 효과를 실현하고 만약에 그림이 모두 정사각형이어야 한다면.이렇게 하면 아주 빠르게 ImageView를 사용자 정의하고 onMeasure 방법을 다시 쓸 수 있습니다.
  •   @Override
      protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec){
          super.onMeasure(widthMeasureSpec,widthMeasureSpec);
      }
    
  • 목록 카드 최적화 현상
  • getView에서 시간 소모 작업을 실행하지 말고 getView에서 그림을 직접 불러오지 마십시오.
  • 비동기 작업의 실행 빈도를 제어합니다. 사용자가 일부러 위아래로 미끄러지면 getView 방법이 끊임없이 호출되어 대량의 비동기 작업이 발생합니다.목록에서 그림을 불러오는 것을 멈출 수 있습니다.ListView나 GridView에 set On Scroll Listener를 설정하고 On Scroll Listener의 onScroll State Changed 방법에서 목록이 미끄럼 상태인지 판단하고, 만약 그렇다면 그림을 불러오는 것을 중지합니다.
  • 대부분의 경우 하드웨어 가속으로 알 수 없는 카드 문제를 해결할 수 있고android:hardwareAccelerated="true"를 설정하면Activity에 하드웨어 가속을 시작할 수 있습니다.
  • 좋은 웹페이지 즐겨찾기