Пишем Android-загрузчик фотографий с помощью AsyncTask

Всем привет. Сегодня напишем простой Android-загрузчик с использованием Java AsyncTask. Наше приложение будет иметь только одну активность. Активность будет иметь поле для ввода url и кнопку "download" для загрузки изображения по url.

Напишем xml-макет для нашей активности:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    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"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <Button
        android:id="@+id/download"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="download"
        android:layout_below="@+id/imageView"
        android:layout_marginTop="150dp"
        android:layout_centerHorizontal="true"
        android:paddingLeft="20dp"
        android:paddingRight="20dp"
        />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_centerInParent="true"
        />

    <EditText
        android:id="@+id/edit_link"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="Link to image"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/download"
        android:layout_marginTop="50dp"/>

</RelativeLayout>

В этом коде нет ничего особенного, не будем заострять на нем внимание. Не забывайте задавать элементам макета id, чтобы потом взаимодействовать с ними в MainActivity.j

Приступим к написанию java-файла активности:

Объявим кнопку, поле для ввода и инициализируем их в методе onCreate:

public class MainActivity extends AppCompatActivity {

    private Button download;
    private EditText editLink;

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

        download = findViewById(R.id.download);
        editLink = findViewById(R.id.edit_link);
    }

}

Потом объявим класс DownloadImage для скачивания изображений. Он будет наследовать класс AsyncTask. Внутри него пока-что объявим наш ImageView и конструктор.

private class DownloadImage extends AsyncTask<String, Void, Bitmap> {
        ImageView image;

        public DownloadImage(ImageView image) {
            this.image = image;
        }
}

Далее в этом классе объявим 2 метода: doInBackground и onPostExecute, которые содержатся в классе AsyncTask.

private class DownloadImage extends AsyncTask<String, Void, Bitmap> {
        ImageView image;

        public DownloadImage(ImageView image) {
            this.image = bmImage;
        }

        protected Bitmap doInBackground(String... urls) {
            
        }

        protected void onPostExecute(Bitmap result) {
            
        }
}

В методе doInBackground объявим объект String с нашим url, объект класса Bitmap с нашей картинкой, которую мы будем скачивать и далее в конструкции try catch скачиваем изображение. В методе onPostExecute наполняем наш ImageView картинкой, которую мы скачали.

private class DownloadImage extends AsyncTask<String, Void, Bitmap> {
        ImageView image;

        public DownloadImage(ImageView image) {
            this.image = image;
        }

        protected Bitmap doInBackground(String... urls) {
            String url = urls[0];
            Bitmap icon = null;
            try {
                InputStream in = new java.net.URL(url).openStream();
                icon = BitmapFactory.decodeStream(in);
                Toast.makeText(MainActivity.this, "All is OK", Toast.LENGTH_SHORT).show();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return icon;
        }

        protected void onPostExecute(Bitmap result) {
            image.setImageBitmap(result);
        }
}

Теперь допишем метод onCreate. Установим обработчик нажатия на кнопку "download". По нажатии будем получать ссылку из editText и с помощью класса DownloadImage скачивать изображение.

download.setOnClickListener(new View.OnClickListener() {
	@Override   
	public void onClick(View v) {
		String link = editLink.getText().toString();
		new DownloadImage((ImageView) findViewById(R.id.imageView)) 
		.execute(link);
	}
});

Конечный код MainActivity.java:

import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.InputStream;

public class MainActivity extends AppCompatActivity {

    private Button download;
    private EditText edit_link;

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

        download = findViewById(R.id.download); //Инициализируем кнопку
        edit_link = findViewById(R.id.edit_link); //Инициализируем поле ввода
        download.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String link = edit_link.getText().toString(); //Получаем введенную ссылку
                new DownloadImage((ImageView) findViewById(R.id.imageView))
                        .execute(link); //Запускаем скачивание
            }
        });
    }
    private class DownloadImage extends AsyncTask<String, Void, Bitmap> {
        ImageView image; //ImageView, который будем наполнять картинкой

        public DownloadImage(ImageView image) {
            this.image = image;
        }

        protected Bitmap doInBackground(String... urls) {
            String urldisplay = urls[0]; //Ссылка
            Bitmap icon = null; //Картинка
            try {
                InputStream in = new java.net.URL(urldisplay).openStream();
                icon = BitmapFactory.decodeStream(in);
                Toast.makeText(MainActivity.this, "All is OK", Toast.LENGTH_SHORT).show(); //Выводим сообщение о том, что все хорошо
            } catch (Exception e) {
                e.printStackTrace();
            }
            return icon;
        }

        protected void onPostExecute(Bitmap result) {
            image.setImageBitmap(result); //Наполняем ImageView картинкой
        }
    }
}

Подведем итоги: В этой статье мы создали простое приложение, которое умеет скачивать и выводить сообщение по url-ссылке. Пишите свои пожелания и предложения по новым темам в комментариях. Всем пока!

Теги:
Android, android studio, java, xml, tutorial

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.