📜  如何在 Android 中使用 Picasso Image Loader Library?

📅  最后修改于: 2021-10-21 05:45:57             🧑  作者: Mango

Picasso是开源的,也是 Android 中广泛使用的图像下载库之一。它由 Square 创建和维护。它是适用于 Android 的强大图像下载和缓存库之一。 Picasso 简化了从外部 URL 加载图像的过程,并将它们显示在您的应用程序上。例如,从服务器下载图像是任何应用程序中最常见的任务之一。它需要大量的代码才能通过 android 网络 API 实现这一点。通过使用毕加索,您可以通过几行代码实现这一点。

如何使用毕加索 Android 库?

第 1 步:创建一个空的活动项目

创建一个空的活动 Android Studio 项目。参考安卓 |如何在 Android Studio 中创建/启动新项目?了解如何创建一个空的活动 Android Studio 项目。请注意,选择Java作为编程语言。

第 2 步:将所需的依赖项添加到应用级 gradle 文件

为了在android项目中使用Picasso,我们需要在app级的gradle文件中添加一个依赖。因此,要添加依赖项,请在 Android 项目的 app 文件夹中打开 app/build.gradle 文件,并在其中添加以下几行。在依赖项中添加这些行{}。

如果无法定位到app级gradle文件并调用依赖,请参考下图。

现在单击“立即同步”按钮。以便Android Studio 下载所需的依赖文件。如果您遇到任何类型的错误,那么您可以在 stackoverflow 上检查错误。

第 3 步:使用清单文件

现在在AndroidManifest.xml文件中添加 InternetPermission。打开 manifest.xml 文件并添加以下行。

步骤 4:使用 activity_main.xml 文件

打开activity_main.xml文件的布局文件。我们需要在应用程序的主布局中添加一个 ImageView。

XML


  
    
  


Java
import androidx.appcompat.app.AppCompatActivity;
  
import android.os.Bundle;
import android.widget.ImageView;
  
import com.squareup.picasso.Picasso;
  
public class MainActivity extends AppCompatActivity {
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
  
        ImageView imageView = findViewById(R.id.imageView);
        Picasso.with(this)
                .load("https://media.geeksforgeeks.org/wp-content/cdn-uploads/logo-new-2.svg")
                .into(imageView);
    }
}


Java
import androidx.appcompat.app.AppCompatActivity;
  
import android.os.Bundle;
import android.widget.ImageView;
  
import com.squareup.picasso.Picasso;
  
public class MainActivity extends AppCompatActivity {
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
  
        ImageView imageView = findViewById(R.id.imageView);
        Picasso.with(this)
                .load("https://media.geeksforgeeks.org/wp-content/uploads/20210101144014/gfglogo.png")
                .resize(300, 300)
                .into(imageView);
    }
}


Java
import androidx.appcompat.app.AppCompatActivity;
  
import android.os.Bundle;
import android.widget.ImageView;
  
import com.squareup.picasso.Picasso;
  
public class MainActivity extends AppCompatActivity {
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
  
        ImageView imageView = findViewById(R.id.imageView);
        Picasso.with(this)
                .load("https://media.geeksforgeeks.org/wp-content/uploads/20210101144014/gfglogo.png")
                .placeholder(R.mipmap.ic_launcher)
                .into(imageView);
    }
}


Java
import androidx.appcompat.app.AppCompatActivity;
  
import android.os.Bundle;
import android.widget.ImageView;
  
import com.squareup.picasso.Picasso;
  
public class MainActivity extends AppCompatActivity {
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
  
        ImageView imageView = findViewById(R.id.imageView);
        Picasso.with(this)
                .load("https://media.geeksforgeeks.org/wp-content/uploads/20210101144014/gfglogo.png")
                .error(R.drawable.error_gfg)
                .into(imageView);
    }
}


Java
import androidx.appcompat.app.AppCompatActivity;
  
import android.os.Bundle;
import android.widget.ImageView;
  
import com.squareup.picasso.Picasso;
  
public class MainActivity extends AppCompatActivity {
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
  
        ImageView imageView = findViewById(R.id.imageView);
        Picasso.with(this)
                .load("https://media.geeksforgeeks.org/wp-content/uploads/20210101144014/gfglogo-300x300.png") // Equivalent of what ends up in onBitmapLoaded
                .placeholder(R.mipmap.ic_launcher)
                .error(R.drawable.error_gfg)
                .centerCrop()
                .fit()
                .into(imageView);
    }
}


第 5 步:使用 MainActivity。 Java文件

现在导航到MainActivity。 Java文件并添加以下代码块。在第一行,我们从布局中获取ImageView实例。然后使用 Picasso 库从Java代码中提到的远程 URL 加载图像。

Java

import androidx.appcompat.app.AppCompatActivity;
  
import android.os.Bundle;
import android.widget.ImageView;
  
import com.squareup.picasso.Picasso;
  
public class MainActivity extends AppCompatActivity {
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
  
        ImageView imageView = findViewById(R.id.imageView);
        Picasso.with(this)
                .load("https://media.geeksforgeeks.org/wp-content/cdn-uploads/logo-new-2.svg")
                .into(imageView);
    }
}

输出:

毕加索图书馆的更多功能

对于任何实时应用,我们必须考虑所有可能的情况。在上面的代码中,我们只是从服务器链接下载图像。但是如何在应用程序中显示该图像。如何调整它的大小以及如果图像加载失败怎么办?我们需要另一个图像显示图像加载失败的错误消息。这对应用程序开发人员来说都很重要。在MainActivity中进行了以下代码更改。 Java文件。

1) 调整大小

在这里,我们使用 Picasso 获取远程图像并在将其显示在ImageView之前调整其大小。

Java

import androidx.appcompat.app.AppCompatActivity;
  
import android.os.Bundle;
import android.widget.ImageView;
  
import com.squareup.picasso.Picasso;
  
public class MainActivity extends AppCompatActivity {
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
  
        ImageView imageView = findViewById(R.id.imageView);
        Picasso.with(this)
                .load("https://media.geeksforgeeks.org/wp-content/uploads/20210101144014/gfglogo.png")
                .resize(300, 300)
                .into(imageView);
    }
}

输出:

2) 占位符

如果您的应用程序依赖于远程资产,那么以占位符图像的形式添加回退很重要。占位符图像会立即显示,并在毕加索完成获取后由远程图像替换。

Java

import androidx.appcompat.app.AppCompatActivity;
  
import android.os.Bundle;
import android.widget.ImageView;
  
import com.squareup.picasso.Picasso;
  
public class MainActivity extends AppCompatActivity {
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
  
        ImageView imageView = findViewById(R.id.imageView);
        Picasso.with(this)
                .load("https://media.geeksforgeeks.org/wp-content/uploads/20210101144014/gfglogo.png")
                .placeholder(R.mipmap.ic_launcher)
                .into(imageView);
    }
}

输出:

3) 错误回退

  • Picasso 支持两种类型的占位符图像。我们已经看到了占位符方法的工作原理,但是还有一个错误方法可以接受占位符图像。 Picasso 将尝试下载远程图像 3 次,如果无法获取远程资源,则会显示错误占位符图像。
  • 在这种情况下,当应用程序没有互联网连接时,将显示错误图像。 Picasso 库显示错误图像,而不是从 URL 加载图像。

Java

import androidx.appcompat.app.AppCompatActivity;
  
import android.os.Bundle;
import android.widget.ImageView;
  
import com.squareup.picasso.Picasso;
  
public class MainActivity extends AppCompatActivity {
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
  
        ImageView imageView = findViewById(R.id.imageView);
        Picasso.with(this)
                .load("https://media.geeksforgeeks.org/wp-content/uploads/20210101144014/gfglogo.png")
                .error(R.drawable.error_gfg)
                .into(imageView);
    }
}

输出:

4) 裁剪

如果您不确定从远程服务器加载的图像的大小,那么图像的大小是多少。所以在这个代码片段中,图像将使图像中心被裁剪。

Java

import androidx.appcompat.app.AppCompatActivity;
  
import android.os.Bundle;
import android.widget.ImageView;
  
import com.squareup.picasso.Picasso;
  
public class MainActivity extends AppCompatActivity {
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
  
        ImageView imageView = findViewById(R.id.imageView);
        Picasso.with(this)
                .load("https://media.geeksforgeeks.org/wp-content/uploads/20210101144014/gfglogo-300x300.png") // Equivalent of what ends up in onBitmapLoaded
                .placeholder(R.mipmap.ic_launcher)
                .error(R.drawable.error_gfg)
                .centerCrop()
                .fit()
                .into(imageView);
    }
}

输出:

使用 Picasso Library 加载图像时的故障排除

OutOfMemoryError 加载错误

如果未加载图像或图像集,请务必检查 Android Studio 中的 Android 监视器日志。您很有可能会看到Java.lang.OutOfMemoryError “Failed to allocate a […] byte allocation with […] free bytes”或 Out of memory on a 51121168-byte allocation 。这很常见,意味着您正在加载一个或多个未正确调整大小的大图像。

首先,您必须找到正在加载的哪些图像可能导致此错误。对于任何给定的毕加索调用,我们可以通过以下一种或多种方法解决此问题:

  1. 通过在布局文件中设置 layout_width=500dp 向 ImageView 添加显式宽度或高度,然后确保在加载期间调用 fit(): Picasso.with(…).load(imageUri).fit().into(… )
  2. 打开静态占位符或错误图像,并确保它们的尺寸相对较小(< 500px 宽度)。如果没有,请调整这些静态图像的大小并将它们保存回您的项目。
  3. 尝试从 ImageView 中删除 android:adjustViewBounds=”true”(如果存在)并且您正在调用 .fit() 而不是使用 .resize(width, height)
  4. 在 Picasso 加载期间调用 .resize(width, height) 并明确设置图像的宽度或高度,例如:
    Picasso.with(…).load(imageUri).resize(500, 0).into(…).通过传递 0,自动计算正确的高度。

参考: https : //github.com/square/picasso