Android 中的图像应用程序运行缓慢
我正在做一个图像应用程序以在 GridView 中显示它们,我从服务器获取 20 个图像。每个图像的分辨率是720*540。我使用JSON解析来获取url并使用下面的代码转换为Bitmap以设置图像。
public static Bitmap loadImageFromUrl(String url) {
InputStream inputStream;Bitmap b;
try {
inputStream = (InputStream) new URL(url).getContent();
BitmapFactory.Options bpo= new BitmapFactory.Options();
if(bpo.outWidth>500) {
bpo.inSampleSize=8;
b=BitmapFactory.decodeStream(inputStream, null,bpo );
} else {
bpo.inSampleSize=2;
b=BitmapFactory.decodeStream(inputStream, null,bpo );
}
return b;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
我的应用程序工作正常,但加载图像花费了太多时间。所以我的应用程序变得很慢。我应该降低图像的分辨率吗?
如何走出困境?
I am doing a app on images to show them in GridView, i am fetching 20 images from server. Resolution of the each image is 720*540.I used JSON parsing to fetch url and used below code to convert into Bitmap in order to set images.
public static Bitmap loadImageFromUrl(String url) {
InputStream inputStream;Bitmap b;
try {
inputStream = (InputStream) new URL(url).getContent();
BitmapFactory.Options bpo= new BitmapFactory.Options();
if(bpo.outWidth>500) {
bpo.inSampleSize=8;
b=BitmapFactory.decodeStream(inputStream, null,bpo );
} else {
bpo.inSampleSize=2;
b=BitmapFactory.decodeStream(inputStream, null,bpo );
}
return b;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
my app is working fine but it is taking too much time to load the images. So that my app became slow. Should i decrease the resolution of images?
how to come out of the issue?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
如果您正在使用网格视图来加载 20 个此类分辨率的图像,我会建议您执行以下操作:
一定要减小图像的大小。除非您的目标是平板电脑,否则就没问题,因为大多数智能手机无法通过 20 张图像达到该分辨率。
如果可以的话缓存图像。
在不同的线程上下载图像。存储一个 HashMap 会让你变得很容易,只需将所有图像视图以图像文件名或其他形式的 ID 作为键即可。下载图像时向您的处理程序发送消息,并在解码后更新视图。您可以直接检索您的视图。请记住检查它们是否仍在窗口中。这样,图像就会快速地一个接一个地显示出来。我不认为多线程处理图像会有帮助,只需确保使用另一个线程“推送图像”和主 UI 线程更新即可。这样用户体验就会大大提高。
希望这有帮助。
---一些实现,我现在没有完整的代码---
有一个数据结构来将视图与传入的数据相匹配。这里非常方便。
当您获取图像 url 列表时,迭代它们:(
这里图片获取器将简单地获取图像(如果尚未缓存)并缓存它)
更新图像视图的代码:
If you are doing a grid view to load 20 images of such resolution, I would suggest the following:
Definitely reduce the size of the images. Unless you are targeting a tablet, you will be fine as most smartphones cannot achieve that resolution with 20 images.
Cache images if you can.
Download the images on a different thread. Store a HashMap would make it easy for you, just put all the imageviews with the image file names or other form of IDs as keys. send message to your Handler when images are downloaded and update the view after it's decoded. You can retrieve your views directly. Just remember to check if they are still in the window. This way the images will show up one after another quickly. I don't think multithreading the images will help, just make sure to use another thread to "push the images" and the main UI thread updates. User experience will be greatly improved then.
Hope this helps.
---some implementations, I don't have the complete code with me right now---
Have a data structure to match the views with data that comes in. very handy here.
When you get the list of image urls, iterate through them:
(Here the picture getter will simply fetch the image if it is not cached already and cache it)
Code to update the image view:
Picasso 库
解决方案是不使用位图直接加载图像,而是使用一个名为 Picasso 的很棒的库,它的速度超级快我知道你真的很喜欢这个,你可以像这样
将 picasso jar 文件添加到你的项目中(在此处下载 picasso jar 文件)使用 picasso 加载图像,如下所示
,其中标题是你要加载的图像路径。裁剪、调整大小、错误是可选的。
Picasso library
Solution is instead of using bitmap to load image directly use a awesome Library called Picasso its just super fast i know you really love this you can do this like this
Add picasso jar file to your project (Download picasso jar file here) Use picasso to load the Image like this
where title is the image path which you want to load. Crop,resize, error are optional.
我猜测大部分加载时间是因为大量图像加上图像大小。
有 2 种可能的解决方案:
调整图像大小,或降低图像质量,使文件大小低于 75kb 左右。
使用多线程一次检索多个图像。如果用户的连接速度真的很慢,这可能没有帮助,但如果您将其与足够小的文件大小结合起来,它可能会有所帮助。您可能想要确定设备的当前带宽是多少,并根据在该带宽上运行的线程数确定。
例如:20 个图像(每个图像 75KB)和 200 KB/s 的可用连接 = 3 或 4 个并发线程。
希望这有帮助。
I'm guessing that most of the loading time is because of the large amount of images combined with the size of the images.
There are 2 possible solutions:
Resize the images, or lower the quality of the images so that the filesize is below 75kb or so.
Use multi-threading to retrieve multiple images at once. This might not help if the user's connection is really slow, but if you combine this with a small enough filesize it might just help out enough. You might want to determine what the current bandwidth of the device is and base the number of threads you run on that.
For instance: 20 images of 75KB each and an available connection of 200 KB/s = 3 or 4 concurrent threads.
Hope this helps.
我的 Android 应用程序也有同样的问题。当您从大尺寸图像中解码位图并将其设置为图像视图的 imageBitmap 时,您的应用程序可能会变慢,经过几次尝试后,您将收到“内存不足异常”
您可以尝试处理此问题的两种可能方法问题:
1-从文件解码时减小位图大小
2- 使用图像库。
我更喜欢第二种方式并使用通用图像加载器。 https://github.com/nostra13/Android-Universal-Image-Loader
I have same problem in my android app. When you decode a bitmap from a big sized image and set as imageBitmap to an image view probably your application will slow and after a few try you'll get an "out of memory exception"
Two of the possible ways you can try to handle this problem:
1- Reduce bitmap size when you decode from file
2- Use an image library.
I prefered second way and used Universal Image Loader. https://github.com/nostra13/Android-Universal-Image-Loader
当您调用该方法时,在 gridView getView 方法中:
这里
getLink()
是互联网链接。when you call the method ,in the gridView getView method:
Here
getLink()
is internet link.