Загрузка изображений в ImageView в Android в отдельном потоке (Java)

Сегодня покажу как загружать изображения с сервера и помещать их в ImageView в Android в отдельном потоке.

Как загрузить изображение с сервера

Начать стоит с того, что изображение должно загружаться в отдельном потоке, а помещаться в контрол в главном потоке.

Чтобы реализовать данную задачу, необходимо создать класс, являющийся наследником класса AsyncTask.

В данном случае я создал класс ImageLoadAsync, наследующий AsyncTask<ImageView, Void, Bitmap>.

package razilov.pro.rus_butik;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.widget.ImageView;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class ImageLoadAsync extends AsyncTask<ImageView, Void, Bitmap> {
    String Url;
    ImageView imgV;

    /* onPostExecute и onPreExecute имеют доступ к UI. Можно взаимодействовать с элементами
     * формы (передав их перед этим в конструкторе) */

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        super.onPostExecute(bitmap);
        imgV.setImageBitmap(bitmap);
    }

    /* Все ссылки и прочий хлам можно передать в конструкторе */
    public ImageLoadAsync(String url, ImageView imgV){
        this.Url = url;
        this.imgV = imgV;
    }


    private Bitmap download_Image(String url) {
        try {
            URL urlstring = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) urlstring.openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            Bitmap myBitmap = BitmapFactory.decodeStream(input);
            return myBitmap;
        } catch (MalformedURLException mex) {
            System.out.println(mex);
            return null;
        } catch (IOException ioex) {
            System.out.println(ioex);
            return null;
        }
    }

    @Override
    protected Bitmap doInBackground(ImageView... params) {
        return download_Image(this.Url);
    }
}

В этом коде в отдельном потоке подгружается Bitmap и передается в поток, имеющий доступ к интерфейсу, откуда не составляет труда присвоить этот Bitmap контролу ImageView.

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *