我目前有一个应用程序,可以将图像从应用程序保存到内部存储器中,以供以后查看。我想拥有该应用程序中所有图像的图库。但是,如果我将7张或更多图片加载到gridview
中,则该应用开始滞后,并且加载该活动将需要一些时间。
所以我想知道如何优化它。
将图像加载到ArrayList
中:
final ArrayList<ImageItem> imageItems = new ArrayList<>();
//TypedArray imgs = getResources().obtainTypedArray(R.array.image_ids);
for (int i = 1; i < getApplicationContext().fileList().length; i++) {
String[] names = getApplicationContext().fileList();
Log.d("HIER:", names[i]);
Bitmap b = null;
try{
InputStream is = getApplicationContext().openFileInput(names[i]);
b = BitmapFactory.decodeStream(is);
} catch(Exception e){
e.printStackTrace();
}
//arrayList.add(new ImageItem(Bitmap.createScaledBitmap(b, 100, 100, false), names[i]));
arrayList.add(new ImageItem(b, names[i]));
设置
gridview
:gridView = (GridView) findViewById(R.id.gridView);
gridAdapter = new GridViewAdapter(this, R.layout.favorite_item, arrayList);
gridView.setAdapter(gridAdapter);
最佳答案
如果要加载大量文件,请在活动开始时初始化一个空的GridView
,启动一个将图像加载到另一个线程中的AsyncTask
,然后再更新GridView
适配器。加载数据后,请记住调用notifyDatasetChanged()
来更新GridView
。
例:
public class ImageLoader extends AsyncTask<Void, Void, ArrayList<ImageItem>> {
YourActivity activity;
public ImageLoader(YourActivity activity) {
this.activity = activity;
}
@Override
protected ArrayList<ImageItem> doInBackground(Void... params) {
ArrayList<ImageItem> imageItems = new ArrayList<>();
//load your images
return imageItems;
}
@Override
protected void onPostExecute(ArrayList<ImageItem> imageItems) {
//call a method from your Activity, that updates the Adapter using the retrieved array
activity.update();
}
}
在您的活动中:
public void update(ArrayList<ImageItem> imageItems) {
//update your adapter's data, and refresh the GridView
}
如果您将拥有数百张图像,则最好使用多个Asynctasks,并在每次加载一些图像时进行更新,这样用户就不必等待数秒钟才能加载所有文件。