1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the License); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an AS IS BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.benchmark.ui; 18 19 import android.graphics.Bitmap; 20 import android.os.AsyncTask; 21 import android.view.LayoutInflater; 22 import android.view.View; 23 import android.view.ViewGroup; 24 import android.widget.BaseAdapter; 25 import android.widget.ImageView; 26 import android.widget.ListAdapter; 27 import android.widget.TextView; 28 29 import com.android.benchmark.R; 30 31 import java.lang.ref.WeakReference; 32 import java.util.HashMap; 33 34 public class ImageListViewScrollActivity extends ListViewScrollActivity { 35 36 private static final int LIST_SIZE = 100; 37 38 private static final int[] IMG_RES_ID = new int[]{ 39 R.drawable.img1, 40 R.drawable.img2, 41 R.drawable.img3, 42 R.drawable.img4, 43 R.drawable.img1, 44 R.drawable.img2, 45 R.drawable.img3, 46 R.drawable.img4, 47 R.drawable.img1, 48 R.drawable.img2, 49 R.drawable.img3, 50 R.drawable.img4, 51 R.drawable.img1, 52 R.drawable.img2, 53 R.drawable.img3, 54 R.drawable.img4, 55 }; 56 57 private static Bitmap[] mBitmapCache = new Bitmap[IMG_RES_ID.length]; 58 59 private static final String[] WORDS = Utils.buildStringList(LIST_SIZE); 60 61 private HashMap<View, BitmapWorkerTask> mInFlight = new HashMap<>(); 62 63 @Override 64 protected ListAdapter createListAdapter() { 65 return new ImageListAdapter(); 66 } 67 68 @Override 69 protected String getName() { 70 return getString(R.string.image_list_view_scroll_name); 71 } 72 73 class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> { 74 private final WeakReference<ImageView> imageViewReference; 75 private int data = 0; 76 private int cacheIdx = 0; 77 volatile boolean cancelled = false; 78 79 public BitmapWorkerTask(ImageView imageView, int cacheIdx) { 80 // Use a WeakReference to ensure the ImageView can be garbage collected 81 imageViewReference = new WeakReference<>(imageView); 82 this.cacheIdx = cacheIdx; 83 } 84 85 // Decode image in background. 86 @Override 87 protected Bitmap doInBackground(Integer... params) { 88 data = params[0]; 89 return Utils.decodeSampledBitmapFromResource(getResources(), data, 100, 100); 90 } 91 92 // Once complete, see if ImageView is still around and set bitmap. 93 @Override 94 protected void onPostExecute(Bitmap bitmap) { 95 if (bitmap != null) { 96 final ImageView imageView = imageViewReference.get(); 97 if (imageView != null) { 98 if (!cancelled) { 99 imageView.setImageBitmap(bitmap); 100 } 101 mBitmapCache[cacheIdx] = bitmap; 102 } 103 } 104 } 105 } 106 107 @Override 108 protected void onPause() { 109 super.onPause(); 110 for (int i = 0; i < mBitmapCache.length; i++) { 111 mBitmapCache[i] = null; 112 } 113 } 114 115 class ImageListAdapter extends BaseAdapter { 116 117 @Override 118 public int getCount() { 119 return LIST_SIZE; 120 } 121 122 @Override 123 public Object getItem(int postition) { 124 return null; 125 } 126 127 @Override 128 public long getItemId(int postition) { 129 return postition; 130 } 131 132 @Override 133 public View getView(int position, View convertView, ViewGroup parent) { 134 if (convertView == null) { 135 convertView = LayoutInflater.from(getBaseContext()) 136 .inflate(R.layout.image_scroll_list_item, parent, false); 137 } 138 139 ImageView imageView = (ImageView) convertView.findViewById(R.id.image_scroll_image); 140 BitmapWorkerTask inFlight = mInFlight.get(convertView); 141 if (inFlight != null) { 142 inFlight.cancelled = true; 143 mInFlight.remove(convertView); 144 } 145 146 int cacheIdx = position % IMG_RES_ID.length; 147 Bitmap bitmap = mBitmapCache[(cacheIdx)]; 148 if (bitmap == null) { 149 BitmapWorkerTask bitmapWorkerTask = new BitmapWorkerTask(imageView, cacheIdx); 150 bitmapWorkerTask.execute(IMG_RES_ID[(cacheIdx)]); 151 mInFlight.put(convertView, bitmapWorkerTask); 152 } 153 154 imageView.setImageBitmap(bitmap); 155 156 TextView textView = (TextView) convertView.findViewById(R.id.image_scroll_text); 157 textView.setText(WORDS[position]); 158 159 return convertView; 160 } 161 } 162 } 163