У меня есть список, в котором я загружаю все изображения (как предварительные просмотры) с пользовательской 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);
}
}
Проблема в том, что все сразу загружается при прокрутке, поэтому прокрутка выполняется очень медленно. Я думал, что произойдет, так как изображение будет просто оставаться пустым (или заполнителем), пока поток не загрузит соответствующее изображение. Наверное, нет.
Спасибо за любую помощь.
У меня есть простая в использовании библиотека под лицензией в основном общедоступном домене, которую вы можете проверить... Она отменяет загрузку для строк, которые не отображаются, и использует два потока для загрузки изображений.
Вы можете проверить это на моем GitHub: https://github.com/tbiehn/Android-Adapter-Image-Loader
Взгляните на мой ответ на этот вопрос, у него есть пример проекта, который показывает, как это сделать, но загружая изображения из сети. Вы должны иметь возможность легко модифицировать его для работы с изображениями с SD-карты.