【问题标题】:Why use Android Picasso library to download images?为什么要使用 Android Picasso 库下载图片?
【发布时间】:2014-03-11 16:30:11
【问题描述】:

我为什么要通过 Picasso 库下载图片,而不是只使用这段代码:

private Bitmap DownloadImage(String URL) 
{
    Bitmap bitmap = null; 
    InputStream in = null; 

    try 
    {
        in = OpenHttpGETConnection(URL);
        bitmap = BitmapFactory.decodeStream(in); in.close();
    } 
    catch (Exception e) 
    {
        Log.d("DownloadImage", e.getLocalizedMessage());
    }

    return bitmap; 
}

另一个问题:

Picasso 是在 UI 中还是通过后台线程下载图像?

【问题讨论】:

  • 非要问就别用了。如果您看不到它可以为您的应用程序带来什么,这意味着您目前不需要它。
  • 好的,你知道毕加索支持哪些安卓版本吗?
  • 没有。但我确信他们有一个包含此类信息的网站。

标签: android image picasso


【解决方案1】:

对于刚接触 Android 或可能从 iOS 迁移到 Android 的任何人,仅供记录......

在发生重大变化之前,您绝对必须使用毕加索。不是开玩笑。

老实说,就是这么简单。优势令人难以置信。

就是这么容易使用:

Picasso.
  with(State.mainContext).
  load(parseImageFile.getUrl()).
  into(null);

你很简单:

必须在 Android 上使用图像处理进行缓存和线程处理。

就这么简单。除非您想从头开始编写,否则您必须使用 Picasso。

请注意,ParseImageFile 本质上是行不通的——它对于缓存等完全没用。 Picasso 有许多令人钦佩的替代品(例如 Universal Image Loader,请查看),但目前 2014 年没有一个比 Picasso 更有效。

注意如果你转向超高级的东西...唯一比毕加索更好的就是转向 Volley。但这是一个巨大的飞跃。

请注意,Android 上的 ListView 滚动比 iOS 上的表格处理滚动问题要严重得多。你可以说,Android + Picasso 更像 iOS 上的情况,所有的工作都已经完成,用于滚动带有图像的大型表格视图。

今天,毕加索 - 简单地说 - 是任何 Android 应用程序的核心部分。谢天谢地,这是一行代码 - 没有设置,什么都没有。

同样,唯一“比”毕加索更好的是如果你搬到 Volley。

顺便说一句,这里有一篇关于 Volley v. Picasso 的优秀长文,如果你需要的话...

http://www.bignerdranch.com/blog/solving-the-android-image-loading-problem-volley-vs-picasso/

【讨论】:

  • 为了清楚起见 Volley 不是一个图像缓存库,您可以使用 Glide github.com/bumptech/glide,它使用 Volley 提供图像缓存。
  • @Hegazy - 绝妙的提示,我不知道 Glide!对,我的意思是使用 Volley 编写自己的代码。再次感谢。
  • 但是毕加索只是为了缓存!如果我想离线使用它,那么缓存可能不存在,最后它每次都会显示一个占位符。 @JoeBlow 的任何解决方案
  • 嗨 aaagam,这是一个完全不相关的问题,与此问题无关,我敦促您提出一个新问题 - 这是一个好问题!
  • 毕加索没有使用 SSL。我试图修改它以信任所有证书(我知道它不安全stackoverflow.com/questions/23562794/…)但它给了我随机崩溃,因为我需要使用旧版本的 okhttp。我正在考虑使用替代方案。我在这个问题上浪费了太多时间。
【解决方案2】:

毕加索在另一个线程中下载图像并为您管理:

  • 此时图片仍在下载中的占位符
  • 调整大小
  • 裁剪/居中/缩放
  • 缓存(不必每次都下载图片)
  • 它甚至可以“图像淡入”,现在很流行/很正常

非常简单,举个例子:

    Picasso.with(context)
           .load(url)
           .placeholder(R.drawable.placeholder)
           .resize(imgWidth, imgHeight)
           .centerCrop()
           .into(image);

【讨论】:

  • +1。它还将为您处理ListView 回收。我强烈建议您不要重新发明轮子。在您的应用中使用任何现有的图像下载库。
  • 非常感谢,有什么教程可以开始吗?
  • 毕加索是 Square 的一个开源项目,这里是一个很好的起点:square.github.io/picasso
  • 我有一个问题,这是我的代码:@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.channel); image=(ImageView)findViewById(R.id.icon2); Picasso.with(this).load("i.imgur.com/DvpvklR.png").into(image); 当我运行应用程序时出现错误
  • @user3376321 :我建议您为此提出一个新问题。包括所有相关代码、xml 布局以及错误堆栈跟踪。
【解决方案3】:

我一直使用 Picasso Library 来处理图片。
它对于管理图片非常有用,而且不用担心内存问题。
当我从服务器或 json 下载图像时,我使用了

 Picasso.with(context).load("image url").fetch();

我将该图像 url 存储到数据库或其他地方。
现在我们可以在任何地方使用该图像(也可以离线使用)。

Picasso.with(context).load("image url").into(ImageView);

【讨论】:

  • 与我的解决方案相同。加一个给你:)
【解决方案4】:
Picasso.with(this).load("http://webneel.com/wallpaper/sites/default/files/images/04-2013/island-beach-scenery-wallpaper.jpg").placeholder(R.mipmap.ic_launcher).fit().into(imageView,
  new Callback() {@
    Override
    public void onSuccess() {}@
    Override
    public void onError() {}
  });

您应该通过毕加索库下载图片,原因如下:

  1. 您可以放置​​一个占位符,以防图像加载需要一些时间。
  2. fit() - 有时某些图像由于大小而无法加载到 imageview 中。此方法将帮助您加载大图像。
  3. onSuccess() - 当图像加载成功时,您可以执行一些操作。
  4. onError() - 当加载图像出现问题时,您可以执行一些操作。

【讨论】:

    【解决方案5】:

    您应该使用像 Picasso、Volley 或 Universal Image Loader 之类的图像加载器库,因为它们会执行您的代码不会执行的以下操作:

    • 高效的多线程网络(当然在后台线程上)
    • 将多个相同的请求合并到一个网络调用中
    • 取消挂起的请求,尤其是在 ListView 项目回收期间
    • 具有各种过期策略的磁盘和内存缓存
    • 图像下采样到目标视图大小以提高性能并减少内存使用量
    • 批处理 UI 更新以提高 UI 响应能力(至少对于 Volley 和 Picasso 而言)。

    顺便说一句,你绝不能在 UI 线程上执行网络请求,因为 HoneyComb,Android 不允许你这样做。

    【讨论】:

      【解决方案6】:

      我知道 Picasso 是一个很棒的库,用于管理 ListView 和 GridView 中的图像,但是在包括 Picasso 在内的所有选项中,我使用 GLIDE...

      它确实可以完美地管理下载和缓存...(下载完成后我无法让 Picasso 使用缓存的图像,但 Glide 做到了就像小菜一碟)。

      这里是 GLIDE 的 Github 页面:

      https://github.com/bumptech/glide

      问候....

      【讨论】:

        【解决方案7】:

        如果您将使用从网络加载图像的核心方法,那么它将需要更多的代码。但是,如果我们将使用像 picasso 这样的第三方库,那么我们将在几行代码中实现我们的目标。
        毕加索图书馆是我迄今为止发现的最好和最简单的。 我们只需要编写以下代码即可使用 picasso 从 Internet 加载图像。

        Picasso.with(this)
        .load("YOUR IMAGE URL HERE")
        .placeholder(Your Drawable Resource) //this is optional the image to display while the url image is downloading
        .error(Your Drawable Resource)         //this is also optional if some error has occurred in downloading the image this image would be displayed
        .into(imageView);
        

        但是如果我们不使用 picasso 库或任何其他库,我们可能需要使用 AsyncTask 来完成,这需要更多的代码行。

        来源:Picasso Android Tutorial

        【讨论】:

          【解决方案8】:

          请在您的build.gradle(Module:app)中添加以下依赖项

          compile 'com.github.bumptech.glide:glide:3.6.1'
          

          【讨论】:

          【解决方案9】:

          Picasso 自动处理与图像下载相关的所有缺陷,例如缓存下载的图像、查找缓存、取消现有请求、执行图像转换和解码、调整图像大小和裁剪图像。

          它允许你自定义它,你可以为缓存配置内存,添加用于向每个请求添加全局信息的请求转换器,添加位图配置以处理默认位图配置未涵盖的格式的解码图像。

          它允许您指定内存策略和网络策略,使其使用缓存或从网络下载。它允许您分别添加要在下载时使用的占位符和错误图像,以防下载错误。

          Picasso 在工作线程上异步下载图像。

          这是使用最新版本 2.71828 的 Picasso 将图像加载到工作线程上的 ImageView 的代码。

          Picasso.get().load(productImageUrl).into(imageView);
          

          以下代码调整图像大小和裁剪图像。

          有关信息,请参阅http://www.zoftino.com/android-picasso-image-downloading-and-caching-library-tutorial。 Picasso.get().load(productImageUrl).resize(400,400).centerCrop().into(imageView);

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-09-20
            • 2018-05-28
            • 1970-01-01
            • 1970-01-01
            • 2017-01-21
            • 2014-06-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多