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