android - 如何优化从内部存储加载图像到 gridview

标签 android android-studio gridview

我目前有一个应用程序可以将图像从应用程序保存到内部存储器以供以后查看。我想在应用程序中拥有所有图像的画廊。但是,如果我将 7 张或更多图片加载到 gridview 中,应用程序就会开始滞后,加载该 Activity 将需要一些时间。

所以我想知道如何优化它。

将图像加载到 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);

最佳答案

如果您正在加载大量文件,请在 Activity 开始时初始化一个空的 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();
  }
}

在您的 Activity 中:

public void update(ArrayList<ImageItem> imageItems) {
    //update your adapter's data, and refresh the GridView
}

如果你有数百张图片,最好使用多个异步任务,并在每次加载一些图片时更新,这样用户就不会等待几秒钟来加载所有文件

关于android - 如何优化从内部存储加载图像到 gridview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36568893/

相关文章:

android - TextView 的高度和宽度没有改变?

android - 我可以使用 backpress 完成 2 个 Activity 吗

java - 为什么发送 Bitmap 时崩溃

android - "Could not get resource"Android Studio Gradle同步错误

asp.net - 如何在 asp.net 中卡住 gridview 列标题?

c# - 对绑定(bind)到 Linq 查询的 GridView 进行排序

android - 使用同一个监听器的几个 Activity

android - 扩展 Android 应用程序时的空指针

android-studio - 如何在Android Studio中自动生成getter和setter

c# - 在 Asp.Net Gridview 中分组数据