Загрузка приложения из галереи Android очень медленная

Я хочу создать приложение Галерея, которое берет список фотографий из моей папки и отображает их на одной странице.

Я уменьшил разрешение изображения, чтобы галерея загружалась быстрее, но загрузка все равно занимает так много времени.

Я думаю, проблема в том, что каждый файл загружается каждый раз, когда приложение открывается. Как я могу решить это?

Я использовал Gridview в приложении.

Мой код:

final GridView[] grid = new GridView[1];
            final File[] files = fileOps.getGoodFiles(); 
            //this will return the array of files (images) to be displayed

            final CustomGrid adapter = new CustomGrid(GeoGallery.this,files);
            grid[0] =(GridView)findViewById(R.id.grid);
            grid[0].setAdapter(adapter);

В моем CustomGridView:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    View grid;
    LayoutInflater inflater = (LayoutInflater) mContext
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    grid = inflater.inflate(R.layout.grid_single, null);
    ImageView imageView = (ImageView)grid.findViewById(R.id.grid_image);
    Bitmap bitmap = BitmapFactory.decodeFile(files[position].getPath());
    bitmap = Bitmap.createScaledBitmap(bitmap,120,120*bitmap.getHeight()/bitmap.getWidth(),false);
    imageView.setImageBitmap(bitmap);

    return grid;
}

Как я могу заставить его загружаться быстрее?

1 ответ

Решение

1) Вы должны использовать GridLayoutManager с RecyclerView. Здесь вы можете получить некоторую помощь.

2) Если я не ошибаюсь, вы загружаете полные изображения, а затем сжимаете их. Вы должны использовать BitmapFactory.Options для загрузки сжатого изображения.

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 8;
Bitmap b = BitmapFactory.decodeFile(filepath[position], options);

3) Операции, такие как загрузка и управление изображениями, очень дороги. Поэтому поместите их в поток в вашем методе onBindViewHolder

final int pos = position;
Thread thread = new Thread() {
     @Override
     public void run() {
          try {
               BitmapFactory.Options options = new BitmapFactory.Options();
               options.inSampleSize = 4;
               Bitmap b = BitmapFactory.decodeFile(filepath[pos], options);

               holder.imageView.setImageBitmap(b)

           } catch (Exception e)
       }
   }
};

Это повысит производительность вашей галереи.

Другие вопросы по тегам