2

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

正如我所知道的,在活动加载之前正在下载图像。加载活动后如何下载图像。我想我需要使用异步任务。但由于我在自定义数组适配器中加载图像,所以不知道该怎么做。

这是我的自定义适配器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;
    }

异步任务:

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;
    }
4

1 回答 1

5

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

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

  1. 使用来自http://brainflush.wordpress.com/2009/11/23/droid-fu-part-2-webimageview-and-webgalleryaadapter/的 droid fu 库中的 WebImageView WebImageView 也使用缓存,因此您不需要再次下载图像你已经下载了。下载图像很昂贵并且会消耗数据。我使用了 WebImageView 并且能够在列表中加载图像。我只花了大约 20 分钟就让它全部工作了,所以你知道它很容易集成。

  2. 第二种选择是使用 async task 。请检查Android:使用 Asynctask 从 Web 加载图像。stackoverflow 中有更多关于如何执行此操作的信息。

每当您的 UI 挂起时,您应该有一种令人毛骨悚然的感觉,即您正在 UI 线程上做某事。

于 2011-11-22T10:12:16.633 回答