我正在寻找Android中的异步图像加载和缓存库.我打算使用Picasso,但我发现Universal Image Loader在GitHub上更受欢迎.有谁知道这两个图书馆?优点和缺点的摘要会很棒.
(我的所有图像都在本地磁盘上,因此我不需要联网,因此我认为Volley不合适)
我基于创建列表和卡片指南创建了RecyclerView示例.我的适配器只有一个模式实现来扩展布局.
问题是滚动性能差.这在RecycleView中只有8个项目.
在一些测试中我验证了在Android L中没有出现这个问题.但在KitKat版本中,性能的下降是显而易见的.
java performance android recycler-adapter android-recyclerview
我使用Glide在我的Android应用程序中加载图像.
3.5更新后,开发人员提供了GlideModule接口.
根据这篇文章(Disk Cache)我可以设置缓存目录,使用setDiskCache方法和ExternalCacheDiskCacheFactory.
但我没有看到任何区别.所有缓存仍在默认缓存目录中的内部存储上.
build.gradle:
dependencies {
...
compile 'com.github.bumptech.glide:glide:3.6.1'
}
Run Code Online (Sandbox Code Playgroud)
Android清单:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application ...>
<meta-data
android:name="com.myapp.GlideConfig"
android:value="GlideModule" />
</application>
Run Code Online (Sandbox Code Playgroud)
GlideConfig.java:
public class GlideConfig implements GlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
Log.e("GlideConfig", "MEDIA_MOUNTED");
builder.setDiskCache(
context.getString(R.string.app_name),
419430400));//400Mb
//Environment.getExternalStorageDirectory().getPath()
// + "/"
// + context.getString(R.string.app_name)
}
else {
Log.e("GlideConfig", …Run Code Online (Sandbox Code Playgroud) 这是毕加索的代码:
ImageView img = (ImageView)findViewById(R.id.product_image);
Picasso.with(this)
.load(_url)
.fit()
.into(img, new Callback() {
@Override
public void onSuccess() {
}
@Override
public void onError() {
}
});
Run Code Online (Sandbox Code Playgroud)
这是_url的价值:http: //kiagallery.ir/Images/Upload/Collection%20101/Spring%20101/d4a03b66dc7b46c694615c549b78b2e9.jpg
这是xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/product_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/product_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="13sp"
android:layout_below="@id/product_image"/>
<TextView
android:id="@+id/product_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="13sp"
android:layout_below="@id/product_name"/>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
你可以看到图像可以通过浏览器访问,但毕加索无法加载它,我已经检查了onError函数,它从未被调用,我很安静地丢失在这里,任何帮助将不胜感激.
编辑:当我给imageview的宽度和高度固定值像200dp时,它加载图像,但当我将其更改为wrap_content时,它不显示图像.
什么是更好的Android库.毕加索还是滑翔?为什么?我现在正在使用毕加索,但图像加载非常慢.滑翔比毕加索快吗?
我正在开发项目,我必须从服务器下载一些图像.我试过这三种方法.
毕加索:
Picasso.with(context).load(image).into(holder.image);
Run Code Online (Sandbox Code Playgroud)
滑行:
Glide.with(context).load(image).into(holder.image);
Run Code Online (Sandbox Code Playgroud)
乱射:
imageLoader.get(image, new ImageLoader.ImageListener() {
@Override
public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
holder.image.setImageBitmap(response.getBitmap());
}
@Override
public void onErrorResponse(VolleyError error) {
}
});
Run Code Online (Sandbox Code Playgroud)
毫无疑问,所有这些方法在快速Internet连接中都能很好地工作.但在2G下载20kb - 25kb的图像需要太多时间.我也试过图像调整大小和一切.但是没有从中得到好结果.我看到像亚马逊或Flipkart这样的应用程序或任何电子商务应用程序这些应用程序在慢速互联网连接中运行良好,并且还能以良好的分辨率下载所有图像.所以,我想要一些关于这些问题的专家解决方案.
我需要在列表页面中显示来自api的图像列表.为此,我使用了两种方法.
第一种方法:
通过将url转换为字节数组,然后将其转换为位图.请找到以下代码..
URL imageUrl = new URL(url);
URLConnection ucon = imageUrl.openConnection();
InputStream is = ucon.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
ByteArrayBuffer baf = new ByteArrayBuffer(500);
int current = 0;
while ((current = bis.read()) != -1) {
/* This approach slowdown the process*/
baf.append((byte) current);
}
byte[] img_ary= baf.toByteArray();
Run Code Online (Sandbox Code Playgroud)
将字节数组转换为位图:
ByteArrayInputStream imageStream = new ByteArrayInputStream(
imgUrl);
Bitmap theImage = BitmapFactory.decodeStream(imageStream);
Run Code Online (Sandbox Code Playgroud)
第二种方法:
基于高度和宽度的图像缩放
private static final String TAG_iamge = "Image";
private static final int IO_BUFFER_SIZE = 4 * 1024;
public static …Run Code Online (Sandbox Code Playgroud) 正如Git中心上的Fresco项目所说:"在Android 4.x及更低版本中,Fresco将图像放在Android内存的特殊区域.这可以让您的应用程序运行得更快 - 并且更容易遭受可怕的OutOfMemoryError."
从这个答案,我知道它使用ashmem来放置位图.
而我的问题是:为什么壁画剂量不能在Android 5.0或更高版本的ashmem中放置位图?Android是否会更改某些系统功能并将其禁用?
实际上,我正在尝试创建一个包含n个多媒体文件的应用程序,其中包括图像和视频.我的应用规模大约是34MB,我的资产规模大约是60mb.当我在正常设备上加载应用程序时,我们没有遇到任何问题,但是具有2K resolutions诸如此类的设备Nexus 6P, HTC, LG,应用程序在进程中间因"内存不足"错误而崩溃.我用这个产生了错误报告.我也尝试过bitmap factory.同时我在数组方法中使用视频.
有人可以帮忙解决这个问题吗?
致命异常:主程序:com.example.we.appname,PID:9353
java.lang.OutOfMemoryError:无法在android.graphics上的android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)的dalvik.system.VMRuntime.newNonMovableArray(Native Method)中分配带有1243880个空闲字节和1214KB的1660396字节分配. android.graphtent.decodeStream(BitmapFactory.java:620)位于android.content.res.ResourcesImpl的android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:455)android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1155) .loadDrawableForCookie(ResourcesImpl.java:720)在android.content.res上的android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:571)android.content.res.Resources.loadDrawable(Resources.java:858).在android.graphics.drawable上的android.graphics.drawable.AnimationDrawable.Arfable(可动画衍生事件中,动画可伸缩. .DrawableInflater.inflat android.content.res.ResourcesImpl上android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1227)的android.graphics.drawable.Drawable.createFromXml(Drawable.java:1200)中的eFromXml(DrawableInflater.java:130) .loadDrawableForCookie(ResourcesImpl.java:715)位于android.content.res.Resources上的android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:571)android.content.Context的android.content.res.Resources.getDrawable(Resources.java:771). android.app.Activity.performCreate的com.example.kq.meettheshps.Score_Card.onCreate(Score_Card.java:58)上的android.view.View.setBackgroundResource(View.java:18228)中的getDrawable(Context.java:525) (Activity.java:6679)在Android.app.ActivityThread.perleLaunchActivity(ActivityThread.java:2618)的android.app.Instrumentation.callActivityCnate(Instrumentation.java:1118)android.app.ActivityThread.handleLaunchActivity(ActivityThread.java: 2726)android.app.ActivityThread.-wrap12(ActivityThread.java)在android.app.ActivityThread $ H.handleMessage(ActivityT)hread.java:1477)android.app.Handler.dispatchMessage(Handler.java:102)android.app.Looper.loop(Looper.java:154)android.app.ActivityThread.main(ActivityThread.java:6119) )at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:886)的com.android.internal.os.ZygoteInit.main(ZygoteInit)中的java.lang.reflect.Method.invoke(Native Method)的.java:776)
android ×10
picasso ×4
bitmap ×2
fresco ×2
image ×2
imageview ×2
java ×2
imagehandler ×1
imageurl ×1
performance ×1