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(不保存图像)的主要内容,如果未能解决你的问题,请参考以下文章

从 URL 显示图像到 Android 应用程序

Android:无法从mysql数据库中检索图像URL并将其显示在imageView中

从android中的json get方法下载数据时使用百分比设置进度条

在运行时将图像从计算机上传并显示到 FLUTTER WEB APP

从 JSON url 下载图像不起作用。 [关闭]

coverflow android:如何从coverflow中的url获取图像