2012-04-13 11 views
6

Tôi đã cố gắng tìm hiểu càng nhiều càng tốt về phát triển Android với trọng tâm cụ thể về hiệu suất vì nhiều ứng dụng trong cửa hàng Play hiện nay chậm chạp. Tôi đã tìm thấy/được chuyển hướng đến nhiều bài viết/video.Có thể BUG trong Android ImageDownloader class: sHardBitmapCache KHÔNG tĩnh khi cần?

Một bài viết cụ thể về bộ nhớ đệm hình ảnh tại địa chỉ: http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html

Tác giả có mã có sẵn tại địa chỉ: http://code.google.com/p/android-imagedownloader/source/browse/trunk/src/com/example/android/imagedownloader/ImageDownloader.java

nào Google dường như để có một phiên bản của thành và đưa vào các lớp học mẫu của họ tại địa chỉ: http://developer.android.com/resources/samples/XmlAdapters/src/com/example/android/xmladapters/ImageDownloader.html

Nói chung nó là rắn, ngoại trừ những gì tôi nghĩ là một lỗ hổng trong bộ nhớ đệm. Nó sử dụng một bộ nhớ đệm mềm/cứng đặt/đưa mọi thứ vào bộ nhớ cache cứng vì hệ thống Android đặt lại bộ đệm mềm khá thường xuyên.

Nhìn vào mã mặc dù, người ta bắt đầu tự hỏi nếu bộ nhớ cache cứng sẽ được vô tình đặt lại mỗi khi lớp cha mẹ được khởi tạo.

Đầu tiên bộ nhớ cache mềm:

// Soft cache for bitmaps kicked out of hard cache 
    private final static ConcurrentHashMap<String, SoftReference<Bitmap>> sSoftBitmapCache = 
     new ConcurrentHashMap<String, SoftReference<Bitmap>>(HARD_CACHE_CAPACITY/2); 

Bây giờ hãy nhìn vào bộ nhớ cache cứng:

// Hard cache, with a fixed maximum capacity and a life duration 
    private final HashMap<String, Bitmap> sHardBitmapCache = 
     new LinkedHashMap<String, Bitmap>(HARD_CACHE_CAPACITY/2, 0.75f, true) { 
     @Override 
     protected boolean removeEldestEntry(LinkedHashMap.Entry<String, Bitmap> eldest) { 
      if (size() > HARD_CACHE_CAPACITY) { 
       // Entries push-out of hard reference cache are transferred to soft reference cache 
       sSoftBitmapCache.put(eldest.getKey(), new SoftReference<Bitmap>(eldest.getValue())); 
       return true; 
      } else 
       return false; 
     } 
    }; 

Các bộ nhớ cache cứngkhôngtĩnh, trong khi bộ nhớ cache mềm là tĩnh. Vì vậy, các ví dụ bộ nhớ cache cứng và do đó các mục được xóa với cuộc sống của thể hiện của lớp.

Lý do tôi nghĩ điều này đúng là tôi nhận thấy ứng dụng của mình với ListView/ImageView, đã tải xuống hình ảnh mọi lúc và không bao giờ lưu vào bộ nhớ cache. Tất cả đều được thực hiện không đồng bộ, nhưng vẫn đánh vào mạng mọi lúc. Tôi xác minh điều này bằng cách đặt một tuyên bố Log.d() bên trong phương pháp của tôi truy cập web và xem thời gian/tần suất được gọi.

Thêm từ khóa tĩnh đã khắc phục sự cố và ứng dụng của tôi hoạt động hiệu quả hơn nhiều.

Tôi không chắc chắn lý do tại sao đây là trường hợp như chỉ có một thể hiện của lớp ImageDownloader trong bộ chuyển đổi của tôi như thể hiện trong ví dụ:

private final ImageDownloader imageDownloader = new ImageDownloader(); 

CÁC CÂU HỎI

Với tất cả điều đó đã nói, có ai khác trải nghiệm điều này không ??? Hoặc tôi là một sự kết hợp của điên/sai bằng cách nào đó. Tôi không có chuyên gia Java/Android/JVM/Dalvik/WeakReference/SoftReference, nhưng có điều gì đó có vẻ hơi lệch. Tôi không biết tại sao sHardBitmapCache không được thực hiện tĩnh, nhưng khi tôi thực hiện thay đổi, ứng dụng của tôi đã ngừng truy cập web rất nhiều (tiết kiệm chi phí dữ liệu/cải thiện hiệu suất thoát nước/hiệu suất pin).

+1

Tôi chỉ đưa ra một cái nhìn ngắn gọn về mã, nhưng có vẻ như bạn đúng - tôi nghi ngờ sHardBitmapCache được dự định là tĩnh, đặc biệt là khi đặt tên nó. – JesusFreke

Trả lời

2

Bạn nói đúng, đây là lỗi đánh máy của tôi.

Tôi đã sửa mã trong cây nguồn Android. Cảm ơn phản hồi này.

+0

Không sao cả. Tôi nhận thấy mã ban đầu đã được chia nhỏ/sao chép vào GitHub nhiều lần. Nếu nó không phải là quá nhiều rắc rối, có lẽ một bản cập nhật cho bài đăng blog sẽ là khôn ngoan để cộng đồng có thể nhận ra sự thay đổi. –

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