Загрузка изображения с помощью AsyncTask - PullRequest
2 голосов
/ 22 ноября 2011

Я пытаюсь создать собственный список адаптеров, который имеет изображение для каждого элемента, который необходимо загрузить из Интернета.Когда я впервые захожу в действие - приложение на некоторое время зависает, пока изображения не загружаются, а затем загружается список действий.

Как я понимаю, изображения загружаются до того, как загрузится упражнение.Как я могу загрузить изображения после загрузки активности.Я думаю, что мне нужно использовать Async Task.Но поскольку я загружаю изображения в пользовательский адаптер массива, я не знаю, как это сделать.

Это мой пользовательский адаптер getView():

public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;

        if (v == null) {
            LayoutInflater vi;
            vi = LayoutInflater.from(getContext());
            v = vi.inflate(R.layout.list_item_default, null);
        }

        Item p = items.get(position);

        if (p != null) {

            TextView list_title = (TextView) v.findViewById(R.id.list_title);
            TextView list_description = (TextView) v
                    .findViewById(R.id.list_description);
            TextView list_timestamp = (TextView) v
                    .findViewById(R.id.list_timestamp);
            ImageView list_image = (ImageView) v.findViewById(R.id.list_image);

            if (list_title != null) {
                list_title.setText(p.getItemTitle());
            }

            if (list_description != null) {
                list_description.setText(p.getItemDescription());
            }

            if (list_timestamp != null) {
                list_timestamp.setText(p.getItemTimestamp());
            }

            if (list_image != null) {
                Log.d("bMobile", "inside getView() image");
                try {
                    URL imageURL = new URL(p.getItemImage());
                    HttpURLConnection con = (HttpURLConnection) imageURL
                            .openConnection();
                    InputStream inputStrem = con.getInputStream();
                    Bitmap image = BitmapFactory.decodeStream(inputStrem);
                    if (null != image)
                        list_image.setImageBitmap(image);
                    else
                        Log.d("bMobile", "Bitmap is Null");
                } catch (Exception e) {
                }
            }
        }

        return v;
    }

AsyncTask:

public class DownloadImagesTask extends AsyncTask<ImageView, Void, Bitmap> {

    ImageView imageView = null;

    @Override
    protected Bitmap doInBackground(ImageView... imageViews) {
        this.imageView = imageViews[0];
        return download_Image((String)imageView.getTag());
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        imageView.setImageBitmap(result);
    }

}
    private Bitmap download_Image(String url) {

        Bitmap bmp =null;
        try{
            URL ulrn = new URL(url);
            HttpURLConnection con = (HttpURLConnection)ulrn.openConnection();
            InputStream is = con.getInputStream();
            bmp = BitmapFactory.decodeStream(is);
            if (null != bmp)
                return bmp;

            }catch(Exception e){}
        return bmp;
    }

1 Ответ

5 голосов
/ 22 ноября 2011

"приложение зависает" - это потому, что вы загружаете изображения в ветке событий или ветке пользовательского интерфейса. Вы никогда не должны делать это. Все операции блокировки, длительные операции, сетевые операции должны выполняться в отдельном потоке. Да, вы можете использовать asynctask для загрузки изображения, которое должно решить проблему.

Для решения проблемы вы можете воспользоваться двумя вариантами

  1. Используйте WebImageView из библиотеки droid fu на http://brainflush.wordpress.com/2009/11/23/droid-fu-part-2-webimageview-and-webgalleryadapter/ WebImageView также использует кеширование, поэтому вам не нужно снова загружать изображения, которые вы уже скачали. Загрузка изображений стоит дорого и потребляет данные. Я использовал WebImageView и смог загрузить изображения в списке. Мне потребовалось всего около 20 минут, чтобы все это заработало, так что вы знаете, как легко его интегрировать.

  2. Второй вариант - использовать асинхронную задачу. Пожалуйста, проверьте Android: загрузка изображения из Интернета с помощью Asynctask . В stackoverflow гораздо больше информации о том, как это сделать.

Каждый раз, когда ваш пользовательский интерфейс зависает, у вас должно быть жуткое ощущение, что вы что-то делаете в потоке пользовательского интерфейса.

...