UIL – ImageAware повторно используется для другого изображения. Задание отменено

Во-первых, у меня есть адаптер, который использует библиотеку Universal Image Loader для получения миниатюр для каждого элемента. Это выглядит так:

public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { convertView = mInflater.inflate(R.layout.page_edit_item, null); viewHolder = new ViewHolder(); viewHolder.thumbnailImageView= (ImageView) convertView.findViewById(R.id.imgPageData); viewHolder.progressBar =(ProgressBar) convertView.findViewById(R.id.photo_upload_progress_view); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.progressBar.setVisibility(View.VISIBLE); String photoPath = getItem(position).getPhoto(); ImageLoader.getInstance().displayImage(photoPath, viewHolder.thumbnailImageView, new SimpleImageLoadingListener(){ @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { progressBar.setVisibility(View.GONE); } }); } 

Когда вы нажимаете на элемент listview, он переходит к активности экрана подробностей. На этом экране я пытаюсь получить подробное изображение (имеет тот же URL-адрес изображения с выбранным элементом).

  ImageLoader.getInstance().displayImage(photoPath, detailImageView); 

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

 ImageAware is reused for another image. Task is cancelled 

Есть ли идея?

Обновление : вот моя конфигурация UIL

  DisplayImageOptions options = new DisplayImageOptions.Builder() .resetViewBeforeLoading(true) .cacheInMemory(true) .cacheOnDisc(true) .bitmapConfig(Bitmap.Config.RGB_565) // default .displayer(new SimpleBitmapDisplayer()) .build(); ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()) .memoryCacheExtraOptions(1024, 768) .discCacheExtraOptions(1024, 768, CompressFormat.JPEG, 75, null) .taskExecutor(getThreadPool()) .taskExecutorForCachedImages(getThreadPool()) .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024)) // default .discCache(new LimitedAgeDiscCache(cacheDir, 3600 * 24 * 7)) // default .discCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default .imageDownloader(new BaseImageDownloader(getApplicationContext())) // default .defaultDisplayImageOptions(options) // default .denyCacheImageMultipleSizesInMemory() .writeDebugLogs() .build(); ImageLoader.getInstance().init(config); 

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

 <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="wrap_content"> </ListView> 

То я изменяю layout_height listView с «wrap_content» на «match_parent», вопрос разрешен!

 <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent"> </ListView> 

Я новичок в этой библиотеке, но я думаю, что проблема в этой строке:

 ImageLoaderConfiguration config.denyCacheImageMultipleSizesInMemory() 

Я считаю, что это гарантирует, что для каждого изображения uri будет храниться только один размер в кэше. Поэтому детальную версию нужно загружать снова и снова.

Кроме того, вы отменяете оставшиеся задачи / нагрузки эскизов после вызова подробного представления? Если нет, то они все еще находятся в стеке.

Изменить: некоторые сведения об API устарели, но вы можете проверить документ конфигурации – http://www.intexsoft.com/blog/item/72-universal-image-loader-part-2.html.

Сообщение в журнале относится к изображениям вида списка. Причина, по которой ваше изображение с подробной страницей занимает больше времени, может быть связано с задержкой, установленной в DisplayImageOptions

 .delayBeforeLoading(1000) 

Вы используете конфигурацию по умолчанию?

Если вы не хотите, чтобы ImageLoader повторно использовал другое изображение, используйте «resetViewBeforeLoading (true)»

  DisplayImageOptions defaultOptions; defaultOptions = new DisplayImageOptions.Builder() .resetViewBeforeLoading(true) .displayer(new FadeInBitmapDisplayer(700)) .cacheOnDisk(true) .cacheInMemory(true) .bitmapConfig(Bitmap.Config.RGB_565) .build(); 

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

Src: – по собственному опыту

Intereting Posts
Полная форма .apk в android Как отправлять почту программно в android с использованием маркера OAuth2.0 Как я могу протестировать биллинг в приложении с помощью не опубликованного приложения? Функции Android JNI работают в основном потоке? LinearLayoutManager setOrientation после вращения телефона не работает Готов к публикации, но не получить вариант публикации Как создать пользовательское уведомление Push для моего собственного приложения? ExpandableListView onChildClickListener Android: загрузка содержимого базы данных sqlite в веб-просмотр Как обращаться к частным строкам ОС Android программно? Невозможно добавить платформу для ios и android (ошибка: ENOENT, нет такого файла или каталога) Панель прогресса Android WebView «Не удалось получить аудиовход для источника записи 1» при попытке инициализировать AudioRecord C ++ 11 cmath не в пространстве имен std для android NDK w / gcc-4.8 или clang 3.4 Java 8 Stream API в Android N