Android - 在显示进度时将图像从 URL 加载到 ImageView(不保存图像)
Posted
技术标签:
【中文标题】Android - 在显示进度时将图像从 URL 加载到 ImageView(不保存图像)【英文标题】:Android - Load image from URL to ImageView while showing progress (without saving the image) 【发布时间】:2017-01-31 14:08:47 【问题描述】:请考虑以下 AsyncTask。它旨在从 URL 下载图像并将其保存到设备,同时通过水平 ProgressBar 显示进度。现在我根本没有使用变量“位图”(它仍然为空)。我希望能够做两件事:
将图像从 URL 加载到 ImageView 而不将实际文件保存到我的设备(这甚至可能吗?),并在执行此操作时显示 ProgressBar - 实际上显示进度,而且不仅仅是一个动画圈子。
(对于了解毕加索的人)使用毕加索(http://square.github.io/picasso/)做同样的事情。
Picasso 确实让一切变得简单,我可以使用这行代码:Picasso.with(getApplicationContext()).load(url).into(imageView);
但是,如果我可以在这样做的同时实际显示进度,那就太好了(再一次,使用实际显示进度的 ProgressBar)。
任何帮助将不胜感激。另外,如果您对当前代码以及如何改进它提供任何反馈,我将不胜感激(这个 YouTube 教程主要跟随它,所以我觉得我应该给予赞扬:https://www.youtube.com/watch?v=5HDr9FdGIVg)。
private class ImageDownloadTask extends AsyncTask<String, Integer, Bitmap>
private int contentLength = -1;
private URL downloadURL = null;
private HttpURLConnection connection = null;
private InputStream inputStream = null;
private File file;
private OutputStream outputStream = null;
private int counter = 0;
private Bitmap bitmap = null;
@Override
protected void onPreExecute()
setProgressBarProgress(0);
showProgressBar();
@Override
protected Bitmap doInBackground(String[] objects)
try
downloadURL = new URL(url);
connection = (HttpURLConnection)downloadURL.openConnection();
contentLength = connection.getContentLength();
inputStream = connection.getInputStream();
file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + "/" + Uri.parse(objects[0]).getLastPathSegment());
outputStream = new FileOutputStream(file);
byte buffer[] = new byte[1024];
int read = -1;
while ((read = inputStream.read(buffer)) != -1)
outputStream.write(buffer, 0, read);
counter += read;
publishProgress(counter);
;
catch (SecurityException e)
Msg.log("Security Exception: " + e.getMessage());
catch (Exception e)
Msg.log("Other Exception: " + e.getMessage());
finally
//Even if our attempt to download the image did not succeed,
//we should still close the connection, and the streams.
//Otherwise, we are potentially wasting the device's resources.
if (connection!=null)
connection.disconnect();
try inputStream.close();
catch (IOException e) e.printStackTrace();
try outputStream.close();
catch (IOException e) e.printStackTrace();
try outputStream.flush();
catch (IOException e) e.printStackTrace();
return bitmap;
@Override
protected void onProgressUpdate(Integer... values)
int progress = (int)(((double)values[0]/contentLength)*100);
setProgressBarProgress(progress);
@Override
protected void onPostExecute(Bitmap result)
hideProgressBar();
if (result != null)
imageView.setImageBitmap(result);
【问题讨论】:
How to add progress bar to Picasso library的可能重复 【参考方案1】:Picasso 不能真正给你下载进度,但你可以给它一个回调,当图像加载完成时调用它。
最常用的方法是显示进度条/圆圈并在下载完成时将其隐藏。
已回复here
【讨论】:
那我的第一个问题呢?这种方法可以做到吗?以上是关于Android - 在显示进度时将图像从 URL 加载到 ImageView(不保存图像)的主要内容,如果未能解决你的问题,请参考以下文章
Android:无法从mysql数据库中检索图像URL并将其显示在imageView中
从android中的json get方法下载数据时使用百分比设置进度条