Пишем 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-ссылке. Пишите свои пожелания и предложения по новым темам в комментариях. Всем пока!

Tags:
Android, android studio, java, xml, tutorial

You can't comment this post because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author's username will be hidden by an alias.