Сегодня покажу как загружать изображения с сервера и помещать их в 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.