我有一个配置文件页面,我也有要从服务器下载的配置文件图像,然后将其置于图像视图中。每次我打开配置文件页面时,此过程都会重复一次。当图像低于500 kb左右时,一切正常,但是当我在其上放置6mb图像时,页面无法正常工作。我的意思是滚动或执行任何操作时都需要时间。就像在弱小的计算机上运行高级图形游戏一样。经过此过程后,我尝试压缩图像,并通过此库https://github.com/zetbaitsu/Compressor将大小减小到2 MB。没什么。为什么会出现此问题。
我正在异步任务上执行此上传过程。
上传方法
public void upload() {
if (filePath != null) {
Bitmap compressedImage = null;
try {
compressedImage = new Compressor(context).compressToBitmap(new File(filePath.getPath()));
} catch (IOException e) {
e.printStackTrace();
try {
compressedImage = MediaStore.Images.Media.getBitmap(context.getContentResolver(), filePath);
} catch (IOException e1) {
e1.printStackTrace();
}
}
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
compressedImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
final String path = MediaStore.Images.Media.insertImage(context.getContentResolver(), compressedImage, "Title", null);
StorageReference sRef = storageReference.child("images/" + name);
sRef.putFile(Uri.parse(path))
.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
if (ımageView != null)
ımageView.setImageURI(Uri.parse(filePath.getPath()));
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
Log.i("resultUpload", exception.getLocalizedMessage());
}
})
.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
@Override
public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
}
});
} else {
}
}
我的下载图片方法
public void download(final ImageView ımageView) {
StorageReference sRef = storageReference.child("images/" + name);
sRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
Picasso.get().load(uri).into(ımageView, new Callback() {
@Override
public void onSuccess() {
}
@Override
public void onError(Exception e) {
}
});
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.i("resultDownload", e.getLocalizedMessage());
}
});
}
答案 0 :(得分:1)
正如米兰所说,您可以做的是在线获取图像,然后将该图像设置为您的imageView
。首先,必须确保您具有的互联网许可:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
然后,您可以执行以下操作将图像设置到imageView
中:
Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL("Your image URL comes here".getContent());
imageView.setImageBitmap(bitmap);
这应该通过获取位于您指定的URL上的图像的位图来实现。然后它将imageView
设置为该位图。
OR ,您可以使用毕加索。将此添加到您的app/build.gradle
:
implementation 'com.squareup.picasso:picasso:2.5.2'
然后使用此Java代码将图像设置为imageView
:
String imageUri = "Your image URL";
Picasso.with(getApplicationContext()).load(imageUri).into(imageView);
这使用Picasso将图像从URL获取到imageView
中。
我希望这会有所帮助。
答案 1 :(得分:1)
这不是Java问题。无论使用哪种语言或平台,都需要执行某些操作才能在网络上正确显示图像。因此,与其推荐任何Java库(我相信您会在每种语言中获得许多开源库),不如列举您需要遵循的基本步骤:
您将为手机,平板电脑和笔记本电脑创建调整大小的图像。对于移动设备,通常为640 x480。对于平板电脑,通常为800 x600。对于笔记本电脑,通常为1024 x 768
然后像您一样压缩图像。确保最终图像是渐进式jpeg / jpg。渐进式jpeg分层压缩。下载图像时,支持渐进式图像的浏览器会显示朦胧的预览。这样可以改善用户体验。对于不支持渐进式图像的浏览器,使用了一些解决方法。例如您可以使用opacity: 1; filter: blur(20px);
创建图像的低质量版本(大小约为1KB)。因此,当下载更高质量的图像时,将显示图像的模糊版本。最初,您将较高质量图像的不透明度设置为0。一旦完成较高质量图像的下载,则将较低质量图像的不透明度设置为0,将较高质量图像的不透明度设置为1。您可以测试图像是否为渐进式here或不渐进式here,并且可以创建压缩的渐进式图像。您可能会以编程方式进行这些操作,但是这些资源可以作为参考。
确保您的服务器支持完全复用的HTTP / 2。您可以在此处看到多路复用。这样就可以并行下载资源。
Getting active window information in Java
确保服务器支持gzip或压缩。因此,资源以压缩格式通过网络传输,并由浏览器自动提取。这样可以确保快速下载。
使用适当的cache-control
标头,以便浏览器缓存图像,而无需每次访问都下载图像。
如果可能的话,应使用移动优先设计,以便移动性能更好。