我目前有一个应用程序,可以将图像从应用程序保存到内部存储器中,以供以后查看。我想拥有该应用程序中所有图像的图库。但是,如果我将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,并在每次加载一些图像时进行更新,这样用户就不必等待数秒钟才能加载所有文件。

07-24 09:47
查看更多