加载图像时如何避免延迟



我正在recyclerView中从服务器加载图像,同时我也在下载该图像。我真正想做的是,直到图像下载,然后显示带有进度条的图像的模糊或暗不透明预览。要加载图像,我使用滑翔和下载,我使用Okhttp

要将图像加载到视图中:-

Glide.with(cont).load(modal.get(position).getMassege()).apply(requestOptions).listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, com.bumptech.glide.request.target.Target<Drawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, com.bumptech.glide.request.target.Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
if(modal.get(position).getProgressPercentage()==0) {
new Thread(new Runnable() {
@Override
public void run() {
downloadFile(modal.get(position).getMassege(), position, modal.get(position).getMsgid(),modal.get(position).getTimeSent());
}
}).start();
}
return false;
}
}).into(holder.image);

下载图像

public void downloadFile(String src, int position, String messageId,String timeStamp) {
try {
java.net.URL url = new java.net.URL(src);
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setDoInput(true);
connection.connect();
int lenghtOfFile = connection.getContentLength();
InputStream input = connection.getInputStream();
String[] fileNam = src.split("/");
OutputStream output = new FileOutputStream(cont.getFilesDir() + fileNam[fileNam.length - 1]);
byte data[] = new byte[1024];
long total = 0;
int count = 0;
int progressPercentage = 0;
Intent intent = new Intent();
intent.setAction(Constants.INTENT_FILTER);
intent.putExtra(Constants.MESSAGE_POSITION_IN_CHAT_LIST, position);
intent.putExtra(Constants.DOWNLOADING_FILE, true);
while ((count = input.read(data)) != -1) {
total += count;
// publishing the progress....
// After this onProgressUpdate will be called
progressPercentage = (int) ((total * 100) / lenghtOfFile);
if(progressPercentage==30||progressPercentage==60||progressPercentage==100) {
intent.putExtra(Constants.PROGRESS, progressPercentage);
intent.putExtra(Constants.FILE_PATH, cont.getFilesDir() + fileNam[fileNam.length - 1]);
intent.putExtra(Constants.MESSAGE_ID, messageId);
cont.sendBroadcast(intent);
}
// writing data to file
output.write(data, 0, count);
Log.d("Downloding" + progressPercentage, "Count" + count);
if (progressPercentage > 99) {
DatabaseHelperChattingToUsers databaseHelperChattingToUsers = new DatabaseHelperChattingToUsers(cont);
String userId = databaseHelperChattingToUsers.getUserExists(sendTo);
String splits[] = userId.split("/");
databaseHelperChattingToUsers.updateContact(new ChattingToUsers(splits[0], sendTo, timeStamp, cont.getFilesDir() + fileNam[fileNam.length - 1],"0"));
DatabaseHelper1 db = new DatabaseHelper1(cont);
db.updateContact(messageId, "", "", "", 100);
String filePath = intent.getStringExtra(Constants.FILE_PATH);
db.updateChatMessage(messageId, filePath);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}

我到达的地方:

我可以并行下载图像,同时在recyclerView中加载图像,同时进度条显示图像下载和图像模糊预览。

我面临的问题:

在recyclerView中加载图像以进行图像的模糊预览时,图像花费的时间很短,但项目视图被添加到recyclerView中,并在之后加载图像

Glide会为您下载图像,您为什么要通过okHttp下载它来付出额外的努力?

下载完整的图像总是会有延迟。这取决于您的网络速度和图像大小。

为了减少延迟,您可以在服务器上存储不同大小的图像。在客户端,首先下载小尺寸的图像,并将其显示在回收视图中。(较小的图像大小==下载时间更短。(

点击recyclerview中的行后,点击另一个url下载完整的图像。

例如

https://www.example.com/images/small/image1.png(250x250像素=100kb(

https://www.example.com/images/medium/image1.png(1000x1000像素=400kb(

https://www.example.com/images/large/image1.png(3000x3000 ox=1200kb(