2013-02-09 18 views

Trả lời

105

Sử dụng mới SparseArray<String>(...) thay vì cho hiệu suất tốt hơn

Bạn đang nhận được cảnh báo này vì lý do mô tả here.

SparseArrays số nguyên bản đồ thành Đối tượng. Không giống như một mảng bình thường của Đối tượng, có thể có khoảng trống trong các chỉ mục. Nó được thiết kế để có hiệu quả hơn so với sử dụng HashMap để ánh xạ số nguyên cho đối tượng.

Bây giờ

làm thế nào tôi sử dụng SparseArray?

Bạn có thể làm điều đó bằng cách dưới đây:

  1. HashMap cách:

    Map<Integer, Bitmap> _bitmapCache = new HashMap<Integer, Bitmap>(); 
    private void fillBitmapCache() { 
        _bitmapCache.put(R.drawable.icon, BitmapFactory.decodeResource(getResources(), R.drawable.icon)); 
        _bitmapCache.put(R.drawable.abstrakt, BitmapFactory.decodeResource(getResources(), R.drawable.abstrakt)); 
        _bitmapCache.put(R.drawable.wallpaper, BitmapFactory.decodeResource(getResources(), R.drawable.wallpaper)); 
        _bitmapCache.put(R.drawable.scissors, BitmapFactory.decodeResource(getResources(), 
    } 
    
    Bitmap bm = _bitmapCache.get(R.drawable.icon); 
    
  2. SparseArray cách:

    SparseArray<Bitmap> _bitmapCache = new SparseArray<Bitmap>(); 
    private void fillBitmapCache() { 
        _bitmapCache.put(R.drawable.icon, BitmapFactory.decodeResource(getResources(), R.drawable.icon)); 
        _bitmapCache.put(R.drawable.abstrakt, BitmapFactory.decodeResource(getResources(), R.drawable.abstrakt)); 
        _bitmapCache.put(R.drawable.wallpaper, BitmapFactory.decodeResource(getResources(), R.drawable.wallpaper)); 
        _bitmapCache.put(R.drawable.scissors, BitmapFactory.decodeResource(getResources(), 
    } 
    
    Bitmap bm = _bitmapCache.get(R.drawable.icon); 
    

Hy vọng nó sẽ giúp.

+0

Hãy chắc chắn xem tài liệu được liên kết liên quan đến chi tiết rằng "triển khai không nhằm mục đích phù hợp với cấu trúc dữ liệu có thể chứa nhiều mục." SparseArray thường chậm hơn so với HashMap có thể so sánh được. –

39

SparseArray được sử dụng khi bạn đang sử dụng Integer làm khóa.

Khi sử dụng SparseArray, các chính sẽ ở lại như một biến nguyên thủy tại mọi thời điểm không giống như khi bạn sử dụng HashMap nơi nó là cần thiết để có Object như một chính đó sẽ gây ra int để trở thành đối tượng Integer chỉ trong một thời gian ngắn trong khi nhận được đối tượng trên bản đồ.

Bằng cách sử dụng SparseArray, bạn sẽ lưu Bộ thu gom rác một số công việc.

Vì vậy, hãy sử dụng giống như Map<Integer,String>.

+4

+1, tránh autoboxing (và các đối tượng liên quan + GC) xảy ra với HashMap. @ cyril-mottier đã viết về nó ở đây: https://speakerdeck.com/cyrilmottier/optimizing-android-ui-pro-tips-for-creating-smooth-and-responsive-apps – orip

+0

Về mặt kỹ thuật, bạn không ** " sử dụng một 'Integer' như là một khóa". Bạn đang sử dụng 'int'. –

5

Đó là gợi ý rằng có cấu trúc dữ liệu tốt hơn cho mã của bạn.

Gợi ý đó là từ Lint. Bạn thường nhận được nó khi bạn có một số nguyên là HashMap.

Lợi thế lớn nhất của nó là xử lý khóa nguyên là nguyên thủy. Nói cách khác, nó sẽ không chuyển sang một số Integer (đối tượng Java) để sử dụng nó làm khóa.

Đây là một vấn đề lớn khi sử dụng bản đồ lớn. HashMap sẽ dẫn đến việc tạo nhiều, nhiều đối tượng Integer trong trường hợp đó.

Xem thêm một vài thông tin khác here.

+0

https://developer.android.com/reference/android/util/SparseArray.html nói: "Việc triển khai không nhằm mục đích thích hợp cho các cấu trúc dữ liệu có thể chứa số lượng lớn các mục. Nó thường chậm hơn một HashMap truyền thống , ... "- điều đó có nghĩa là: nếu bạn quan tâm đến tốc độ và muốn lưu trữ nhiều giá trị, bạn phải sử dụng HashMap. –

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