Android загружает изображения в просмотр списка асинхронно?

1

У меня есть список, в котором я загружаю все изображения (как предварительные просмотры) с пользовательской SD-карты. У меня есть пользовательский SimpleCursorAdapter, и когда я переопределяю метод getView(), я пытаюсь запустить фоновый поток для загрузки изображения.

То, что я пытаюсь сделать, - это в основном "ленивая загрузка" изображений в виде списка в фоновом потоке или что-то еще. Я открыт для новых решений. Основная проблема заключается в том, что прокрутка является нелогичной медленной, так как загрузка изображений настолько дорога, что операция.

Вот соответствующий код, который я пытаюсь:

public class listOfImages extends SimpleCursorAdapter {

private Cursor c;
private Context context;


public listOfImages(Context context, int layout, Cursor c,
        String[] from, int[] to) {
    super(context, layout, c, from, to);
    this.c = c;
    this.context = context;

}

public View getView(int pos, View inView, ViewGroup parent) {
    View v = inView;
    if (v == null) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = inflater.inflate(R.layout.image_item, null);
    }


    this.c.moveToPosition(pos);     
    int columnIndex = this.c.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME);
    String name = this.c.getString(columnIndex);
    columnIndex = this.c.getColumnIndexOrThrow(MediaStore.Images.Media.SIZE);
    String size = this.c.getString(columnIndex);
    columnIndex = this.c.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    String data = this.c.getString(columnIndex); //gives the filename 



    TextView sTitle = (TextView) v.findViewById(R.id.image_title);
    sTitle.setText(name);

    imagePreviewLoader ipl = new imagePreviewLoader(v, data); 
    ipl.mainProcessing(); 


    v.setTag(data); 

    v.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            Toast.makeText(context, "Image: " + v.getTag(), Toast.LENGTH_SHORT).show();  

            String filename = (String) v.getTag(); 


            Intent intent = new Intent(context, ViewImage.class);
            intent.putExtra("filename", filename);
            context.startActivity(intent);

        }
    });

    return v; 
}

}

И теперь фоновый поток, который я пытаюсь:

public class imagePreviewLoader {

private Handler handler = new Handler(); 
private View v; 
private String data;

public imagePreviewLoader(View v, String data) {
    this.v = v;
    this.data = data; 
}

protected void mainProcessing() {
    Thread thread = new Thread(null, doBackground, "Background"); 
    thread.start(); 
}

private Runnable doBackground = new Runnable() {
    public void run() {
        backgroundThreadProcessing(); 
    }
};

private void backgroundThreadProcessing() {
    handler.post(doUpdateGUI); 
}

private Runnable doUpdateGUI = new Runnable() {
    public void run() {
        updateGUI();
    }
}; 

private void updateGUI() {
    ImageView img = (ImageView) v.findViewById(R.id.image_view); 
    BitmapFactory.Options bfo = new BitmapFactory.Options();
    bfo.inSampleSize = 30;
    bfo.inTargetDensity = 50; 
    Bitmap bm = BitmapFactory.decodeFile(data, bfo);
    img.setImageBitmap(bm);
}

}

Проблема в том, что все сразу загружается при прокрутке, поэтому прокрутка выполняется очень медленно. Я думал, что произойдет, так как изображение будет просто оставаться пустым (или заполнителем), пока поток не загрузит соответствующее изображение. Наверное, нет.

Спасибо за любую помощь.

  • 0
    Соглашение об именах Java для классов заключается в том, что они начинаются с заглавной буквы. Таким образом, listOfImages должен быть «ListOfImages». Я упоминаю об этом только потому, что конструктор смутил меня на мгновение из-за этого.
  • 0
    Вы можете ввести некоторую задержку перед запуском задания и отменить задание, если сделана попытка повторно использовать представление до завершения задания. Это будет включать в себя сохранение задачи с представлением.
Показать ещё 2 комментария
Теги:
multithreading
listview

2 ответа

1

У меня есть простая в использовании библиотека под лицензией в основном общедоступном домене, которую вы можете проверить... Она отменяет загрузку для строк, которые не отображаются, и использует два потока для загрузки изображений.

Вы можете проверить это на моем GitHub: https://github.com/tbiehn/Android-Adapter-Image-Loader

1

Взгляните на мой ответ на этот вопрос, у него есть пример проекта, который показывает, как это сделать, но загружая изображения из сети. Вы должны иметь возможность легко модифицировать его для работы с изображениями с SD-карты.

  • 0
    спасибо большое посмотрю
  • 0
    эй, я адаптировал большую часть кода под свой, я просто столкнулся с проблемой со следующей строкой: final int stub_id = R.drawable.stub; Что такое заглушка? Благодарю.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню