La carga de imágenes en android es un proceso pesado que en muchas ocasiones provoca una carga de trabajo extra al dispositivo, tanto en ejecución como en gasto de memoria a la hora de compilar el proyecto. Gracias a librerías como Glide o Picasso esta tarea se facilita ya que las imágenes se cargan desde una URL y se colocan en un contenedor. Lo primero que se debe hacer es apuntar a las librerías correspondientes

compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.github.bumptech.glide:glide:3.8.0'

Y dar permisos de internet a la aplicación para que se pueda conectar con el servidor y traer la url de la imagen, por lo que en el manifest se añaden las siguientes lineas

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission-sdk-23 android:name="android.permission.INTERNET"/>

Ambas librerías realizan tareas muy similares, siendo la de Glide superior en número de posibilidades pero peor en tamaño. Del mismo modo Glide admite la compatibilidad con formato GIF

Picasso

Para poder cargar una imagen en un ImageView se deben ejecutar los siguientes métodos

Picasso.with(MainActivity.this)
                .load("https://url_imgen.jpg").
                into(sitioImagenPicasso);

Para poder cargar una imagen en un ImageView con las opciones de imagen de precarga y imagen de error en el caso de no poder cargar la imagen definitiva

Picasso.with(context)
    .load(https://url_imagen);
    .placeholder(R.drawable.carga)
    .error(R.drawable.error)
    .into(imageView);

Glide

La libreria glide realiza operaciones muy parecidas a Picasso, incluyendo funcionalidades nuevas como por ejemplo el soporte a archivos .gif. Para el resto de tareas la funcionalidad es la misma

        Glide.with(MainActivity.this).load(urlCorrectaDos).placeholder(R.drawable.load).error(R.drawable.error).into(sitioImagenGlideOk);
        //Glide.with(MainActivity.this).load(urlIncorrecta).placeholder(R.drawable.load).error(R.drawable.error).into(sitioImagenGlideFail);

Una de las funciones adiciones es la de guardar en caché la imagen para posibilitar la carga de imagen si no hay internet. Para ello se se utiliza el método diskCacheStrategy() donde como parámetro se pasa la estrategia a seguir para guardar la imagen

Glide.with(MainActivity.this).load(urlIncorrecta).placeholder(R.drawable.load).error(R.drawable.error).diskCacheStrategy(DiskCacheStrategy.ALL).into(sitioImagenGlideFail);

El código del ejemplo utilizado es:

public class MainActivity extends AppCompatActivity {

    @Bind(R.id.imagenPicassoCorrecta) ImageView sitioImagenPicassoOk;
    @Bind(R.id.imagenPicassoIncorrecta) ImageView sitioImagenPicassoFail;
    @Bind(R.id.imagenGlidecorrecta) ImageView sitioImagenGlideOk;
    @Bind(R.id.imagenGlideIncorrecta) ImageView sitioImagenGlideFail;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        String urlCorrecta = "http://developandsys.es/aplicaciones/recursos/logos_lenguajes/java.png";
        String urlCorrectaDos = "http://developandsys.es/aplicaciones/recursos/logos_lenguajes/csharp.png";

        String urlIncorrecta = "http://developandsys.es/aplicaciones/recursos/logos_lenguajes/javad.png";

        //Picasso.with(MainActivity.this).load(url).into(sitioImagenPicasso);
        //Picasso.with(MainActivity.this).load(url).error(R.drawable.error).into(sitioImagenPicassoOk);
        //Picasso.with(MainActivity.this).load(url).resize(100,100).centerCrop().error(R.drawable.error).into(sitioImagenPicassoOk);
        //Picasso.with(MainActivity.this).load(url).centerCrop().error(R.drawable.error).into(sitioImagenPicasso);
        //Picasso.with(MainActivity.this).setIndicatorsEnabled(true);
        Picasso.with(MainActivity.this).load(urlCorrecta).placeholder(R.drawable.load).error(R.drawable.error).into(sitioImagenPicassoOk);
        Picasso.with(MainActivity.this).load(urlIncorrecta).placeholder(R.drawable.load).error(R.drawable.error).into(sitioImagenPicassoFail);

        //Glide.with(MainActivity.this).load(urlCorrecta).into(sitioImagenGlideOk);
        Glide.with(MainActivity.this).load(urlCorrectaDos).placeholder(R.drawable.load).error(R.drawable.error).into(sitioImagenGlideOk);
        //Glide.with(MainActivity.this).load(urlIncorrecta).placeholder(R.drawable.load).error(R.drawable.error).into(sitioImagenGlideFail);
        Glide.with(MainActivity.this).load(urlIncorrecta).placeholder(R.drawable.load).error(R.drawable.error).diskCacheStrategy(DiskCacheStrategy.ALL).into(sitioImagenGlideFail);
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.developandsystem.libreriasimagenes.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.5"
        android:orientation="horizontal">
        <ImageView
            android:id="@+id/imagenPicassoCorrecta"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.5" />
        <ImageView
            android:id="@+id/imagenPicassoIncorrecta"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.5" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.5"
        android:orientation="horizontal">
        <ImageView
            android:id="@+id/imagenGlidecorrecta"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.5" />
        <ImageView
            android:id="@+id/imagenGlideIncorrecta"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.5" />
    </LinearLayout>
</LinearLayout>
apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.0"
    defaultConfig {
        applicationId "com.developandsystem.libreriasimagenes"
        minSdkVersion 21
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}


dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:26.+'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.squareup.picasso:picasso:2.5.2'
    compile 'com.github.bumptech.glide:glide:3.8.0'
    compile 'com.jakewharton:butterknife:7.0.1'
    compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
    testCompile 'junit:junit:4.12'
}