据我所知,universal-image-loader提供了两种显示图像的方法.imageLoader.loadImage和imageLoader.displayImage.但是这两个方法必须绑定到要显示的UI元素.我可以只在线程中下载缓存文件(以备将来显示).我现在不需要显示这些图像.
我有ListView文本和来自互联网的大图像.我的图片项目适合宽度和wrap_content高度.
我尝试用UIL&显示背景图像Picasso.它们都可以工作但是当我停止滚动时图像总是重新加载,它使ListView闪烁
它看起来像这样:

当我停止滚动时(我向下滚动然后向上滚动),您可以看到它重新加载下载和缓存的图像.
我怎样才能防止这种情况发生?
<ImageView android:id="@+id/imgFeed"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="centerCrop"/>
// UIL
options = new DisplayImageOptions.Builder()
.showImageOnLoading(defaultImage)
.showImageOnFail(defaultImage)
.showImageForEmptyUri(defaultImage)
.resetViewBeforeLoading(false)
.cacheOnDisk(true).delayBeforeLoading(0)
.displayer(new FadeInBitmapDisplayer(200)).cacheInMemory(true).imageScaleType(ImageScaleType.EXACTLY_STRETCHED).build();
ImageAware imageAware = new ImageViewAware(viewHolder.imgFeed, false);
ImageLoader.getInstance().displayImage(item.getPhotoUrl(), imageAware, options);
// Picasso
Picasso.with(getContext())
.load(item.getPhotoUrl())
.placeholder(R.drawable.place_holder_big)
.resize(screenWidth, 0) //set max width
.into(viewHolder.imgFeed);
Run Code Online (Sandbox Code Playgroud)
对于UIL,我在这个问题上尝试了很多方法,但它们根本不适用于我.
更新:似乎我遇到了像这个问题的内存缓存问题.但是我该如何解决这个问题呢?看看Facebook应用程序,他们做得非常好.所有图像都有不同的尺寸,适合的宽度,非常平滑的滚动,无需重新加载图像.他们怎么能这样做?
我正在使用通用图像加载器,我每天都会收到大量无法为用户加载的图像.我正在使用此代码将错误归结为分析.
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
try
{
String fail = failReason.getType().toString();
String fail4 = failReason.getCause().toString();
String sum = fail + " " + fail4;
EasyTracker.getTracker().sendException(sum, false);
}
catch (Exception e)
{
EasyTracker.getTracker().sendException(e.getMessage(), false);
}
}
Run Code Online (Sandbox Code Playgroud)
大部分时间它捕获异常,因为getType或getCause为null.在具有2.1-2.3安卓版本的设备上可以看到此问题,但有一些报告来自较新版本,如4.0.4甚至4.2.2.所以我无法确定导致图像无法加载的原因
另一个问题是IO_ERROR java.io.EOFException,主要出现在较新的Android版本上.
第三个最常见的错误是out_of_memory错误...我试图加载的图像不大于1mb,但我需要有ScaleType.Exactly,但是在加载更大的图像时我不会将它们缓存在内存或光盘中,以减少out_of_memory的可能性,但它仍然经常发生.
我的配置:
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(xxx.getApplicationContext())
.threadPoolSize(4)
.memoryCache(new WeakMemoryCache())
.imageDownloader(new BaseImageDownloader(xxx.getApplicationContext(),10 * 1000, 30 * 1000))
.build();
if(!ImageLoader.getInstance().isInited())
ImageLoader.getInstance().init(config);
// options is used for images smaller in size (5kb-150kb)
options = new DisplayImageOptions.Builder()
.cacheInMemory() …Run Code Online (Sandbox Code Playgroud) Android-Universal-Image-Loader(https://github.com/nostra13/Android-Universal-Image-Loader)是我最喜欢的图书馆.
但是当我使用Android Studio(使用0.1.5版本)时它无法添加库.
我知道如何在Android Studio中添加库(/sf/answers/1163994751/)
当我将Android-Universal-Image-Loader库添加到Android Studio时.关于"无法重新获得R"的编辑错误.我尝试这个Max OSX(我尝试Windows但失败.Windows错误消息=>"Gradle:错误:包com.nostra13.universalimageloader.core不存在".但编辑没有错误消息.仅在我运行应用程序时显示)
像Gson这样的其他libs没问题.但只有Android-Universal-Image-Loader才有这个问题.
您的Android Studio成功添加Android-Universal-Image-Loader?如果成功告诉我如何.
我有一个活动,其中包含SD卡中包含的视频文件列表.我想显示视频缩略图和视频名称.但是当我尝试加载此活动时,加载和列表滚动花费的时间太多不太顺利.我想为此使用Universal loader.但是不知道如何使用视频缩略图?请帮忙
我正在开发新的Google Map v2 API.
我使用ImageLoader在Marker上动态显示图像.
但问题是当我使用Universal Image Loader的onLoadingComplete()时,ImageView既不会自动也不会手动失效.
下次如果单击相同的标记,将从通用图像加载器的缓存中显示图像.
下面是我的CustomInfoWindowAdapter代码:
private class CustomInfoWindowAdapter implements InfoWindowAdapter {
@Override
public View getInfoContents(Marker marker) {
return null;
}
@Override
public View getInfoWindow(Marker marker) {
final View mWindow = getLayoutInflater().inflate(R.layout.custom_info_window, null);
render(marker, mWindow);
return mWindow;
}
private void render(final Marker marker, View view) {
final String url = markers.get(marker.getId()).getStrProfilePic();
final ImageView image = ((ImageView) view.findViewById(R.id.badge));
Log.e(TAG, "URL : " + url);
if ( url != null && !url.equalsIgnoreCase("null")
&& !url.equalsIgnoreCase("")) {
imageLoader.displayImage(url, …Run Code Online (Sandbox Code Playgroud) 我正在使用Universal Image Loader 1.8.6库来加载从网络上拍摄的动态图像.
的ImageLoaderConfiguration配置如下:
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
.memoryCacheExtraOptions(480, 800) // default = device screen dimensions
.threadPoolSize(3) // default
.threadPriority(Thread.NORM_PRIORITY - 1) // default
.denyCacheImageMultipleSizesInMemory()
.memoryCacheSize(2 * 1024 * 1024)
.memoryCacheSizePercentage(13) // default
.discCacheSize(50 * 1024 * 1024)
.discCacheFileCount(100)
.imageDownloader(new BaseImageDownloader(getApplicationContext())) // default
.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
.writeDebugLogs()
.build();
Run Code Online (Sandbox Code Playgroud)
并且DisplayImageOptions配置是:
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.no_foto)
.showImageForEmptyUri(R.drawable.no_foto)
.showImageOnFail(R.drawable.no_foto)
.build();
Run Code Online (Sandbox Code Playgroud)
我的ArrayAdapter中的getView方法包含以下代码:
iv.setImageResource(R.drawable.no_foto);
imageLoader.displayImage(basePath+immagine, iv);
Run Code Online (Sandbox Code Playgroud)
上面代码的第一行用于避免gridView中的视图回收允许将图像设置在错误的位置(直到图片没有下载).
实际问题是这样的:
如果我打开我的Activity(包含GridView)所显示的项目,感谢UIL库可以下载图像.(同时no_foto.png图像显示在网格的每个视图中).当所有视图都加载了自己的图像时,如果我尝试向下滚动然后我回来(向上滚动)我必须等待图像重新加载,因为所有视图现在都被no_foto.png图像占用.
如何避免重载这些图像?使用Universal …
android android-imageview android-gridview android-view universal-image-loader
我正在使用universal-image-loader库来加载图像,但是当我copy()在某些情况下调用加载的位图文件时,我得到了OutOfMemoryError.这是我的代码:
ImageLoader.getInstance().loadImage(path, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String arg0, View arg1) {
// TODO Auto-generated method stub
}
@Override
public void onLoadingFailed(String arg0, View arg1, FailReason arg2) {
// TODO Auto-generated method stub
}
@Override
public void onLoadingComplete(String arg0, View arg1, Bitmap arg2) {
bm = arg2;
}
@Override
public void onLoadingCancelled(String arg0, View arg1) {
// TODO Auto-generated method stub
}
});
Bitmap bm2= bm.copy(Bitmap.Config.ARGB_8888, true); //where the crash happens
Run Code Online (Sandbox Code Playgroud)
我需要第二个Bitmap …
我正在尝试使用UIL将图像加载到位图.我需要加载多个图像,我注意到在某些情况下图像网址可能是相同的.在这种情况下,只加载第一张图像.如何避免在UIL中取消请求?
代码在循环中运行3次:
ImageSize targetSize = new ImageSize(70, 70);
ImageLoader.getInstance().loadImage("http://icons.iconarchive.com/icons/yellowicon/game-stars/256/Mario-icon.png", targetSize, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
Log.e("tag", "onLoadingStarted");
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
Log.e("tag", "onLoadingFailed");
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
Log.e("tag", "onLoadingComplete");
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
Log.e("tag", "onLoadingCancelled");
}
});
Run Code Online (Sandbox Code Playgroud)
日志是:
onLoadingStarted
onLoadingStarted
onLoadingStarted
onLoadingComplete
onLoadingCancelled
onLoadingCancelled
Run Code Online (Sandbox Code Playgroud) 我正在使用UIL与此配置从FILE加载图像:
BitmapDisplayer displayer = new FadeInBitmapDisplayer(500) {
@Override
public Bitmap display(Bitmap bitmap, ImageView imageView,
LoadedFrom loadedFrom) {
if (loadedFrom != LoadedFrom.MEMORY_CACHE) {
return super.display(bitmap, imageView, loadedFrom);
} else {
imageView.setImageBitmap(bitmap);
return bitmap;
}
}
};
DisplayImageOptions options = new DisplayImageOptions.Builder()
.cacheInMemory(true).resetViewBeforeLoading(true)
.showImageForEmptyUri(R.drawable.thumbnail_no_image)
.showImageOnFail(R.drawable.thumbnail_no_image)
.displayer(displayer).build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
context).defaultDisplayImageOptions(options)
.memoryCacheSize(2 * 1024 * 1024).build();
sLoader.init(config);
Run Code Online (Sandbox Code Playgroud)
GridView在我考虑选择任何项目后,我需要实现选择,我打电话notifyDataSetChanged让我的selectionOverlay可见.在此调用之后,所有图像开始重新加载,这导致GridView闪烁.我怎么能避免这个?