使用AsyncTask加载图像

时间:2011-11-22 10:03:01

标签: android android-asynctask custom-adapter

我正在尝试创建一个自定义列表适配器,它需要从互联网上下载每个项目的图像。当我第一次进入活动时 - 应用程序冻结一段时间,直到下载图像,然后加载活动列表。

我可以看出,在活动加载之前正在下载图像。如何在活动加载后下载图像。我想我需要使用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 个答案:

答案 0 :(得分:5)

“应用程序冻结” - 这是因为您正在事件线程或UI线程上下载图像。你永远不应该这样做。所有阻塞操作,长时间运行的操作,网络操作都应该在单独的线程上运行。是的,您可以使用asynctask来执行图像加载,这应该可以解决问题。

您可以采取两种方法来解决问题:

  1. http://brainflush.wordpress.com/2009/11/23/droid-fu-part-2-webimageview-and-webgalleryadapter/使用droid fu库中的WebImageView WebImageView也使用缓存,因此您无需再次下载已下载的图像。下载图像很昂贵并且消耗数据。 我使用了WebImageView,并能够在列表中加载图像。我花了大约20分钟才完成所有工作,所以你知道它很容易整合它。

  2. 第二个选项是使用异步任务。请检查Android : Loading an image from the Web with Asynctask。 stackoverflow中有很多关于如何执行此操作的信息。

  3. 任何时候你的用户界面挂起,你应该有一种令人毛骨悚然的感觉,你在UI线程上做了一些事情。