Во-первых, у меня есть адаптер, который использует библиотеку 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: – по собственному опыту