Почему я должен проверить mPosition в моей AsyncTask onPostExecute?
Я использую AsyncTask
лениво загружать изображения в мой ListView
,
Это все работает правильно, но я не понимаю, почему я должен проверить мой mHolder.hPosition
против mPosition
в onPostExecute
метод. Если я не проверю эти значения, старые изображения будут циклически повторяться ListItems
- но почему mHolder.hPosition
а также mPosition
не всегда равны, если они вызываются в одном и том же AsyncTask
?
Вот мой урезанный код:
@Override
public View getItemView(final int position, View convertView, final ViewGroup parent) {
final ViewHolder holder;
final Job job = (Job) getStore().get(position);
if (convertView == null) {
// New List Item
holder = new ViewHolder();
convertView = getInflater().inflate(ITEM_LAYOUT, parent, false);
holder.hPosition = position;
holder.hImageView = (ImageView) convertView.findViewById(R.id.app_component_joblistitemview_logo);
convertView.setTag(holder);
} else {
// Recycled List Item
holder = (ViewHolder) convertView.getTag(); // get the ViewHolder that is stored in the Tag
holder.hPosition = position;
}
holder.hImageView.setImageBitmap(null); // set the list item's image to be blank
new DownloadImageTask().execute(position, holder); // async download the image
return convertView;
}
// DownloadImageTask
private class DownloadImageTask extends AsyncTask<Object, Void, Integer> {
Integer mPosition;
ViewHolder mHolder;
@Override
protected Integer doInBackground(Object... params) {
mPosition = (Integer)params[0];
mHolder = (ViewHolder)params[1];
// Download the Image ...
// ...
return 1;
}
protected void onPostExecute(Integer result) {
// >> This is the Spot I am Asking About <<
// Shouldn't mHolder.hPosition ALWAYS be equal to mPosition, since it's still the same AsyncTask?
// Why are mHolder.hPosition and mPosition often not equal?
if (mHolder.hPosition==mPosition) {
// ... update the List View Item
}
}
}
1 ответ
Пока вы загружаете изображение, вы можете продолжить прокрутку списка.
ViewHolder может быть переработан и может иметь другие данные в данный момент.
Чтобы проверить, находится ли ViewHolder в правильном положении, вы должны проверить, совпадает ли фактическая позиция на держателе с той же позицией, которая сгенерировала событие загрузки на onPostExecute.