Android:从服务器获取图像

时间:2016-08-18 04:27:28

标签: android listview bitmap

我使用了包含ImageView和TextView的ListView。我想从服务器获取图像。我调试下面的代码,告诉我可以使图像成功,但是当返回时,图像消失了。我不知道为什么。我是android的新手。希望有人能帮助我。

ListView适配器类:

public View getView(int position, View convertView, ViewGroup parent) {
    News news = getItem(position); 
    View view = LayoutInflater.from(getContext()).inflate(resourceId, null);
    newsImage = (ImageView) view.findViewById(R.id.news_image);
    newsTitle = (TextView) view.findViewById(R.id.news_title);

    newsTitle.setText(news.getTitle());
    bitmap = HttpUtil.sendImageRequest(news.getImageUrl());
    newsImage.setImageBitmap(ImageUtility.ImageSolution(bitmap, newsImage));
    return view;
}

sendImageRequest方法:

public static Bitmap sendImageRequest(final String address){
    final Bitmap[] bitmap = new Bitmap[1];
    new Thread(new Runnable() {
        @Override
        public void run() {
            HttpURLConnection connection = null;
            try {
                connection = (HttpURLConnection) new URL(address).openConnection();
                connection.setRequestMethod("GET");
                connection.setDoInput(true);

                InputStream in = connection.getInputStream();
                bitmap[0] = BitmapFactory.decodeStream(in);
            } catch (java.io.IOException e) {
                e.printStackTrace();
            } finally {
                if (connection != null){
                    connection.disconnect();
                }
            }
        }
    }).start();
    return bitmap[0];
}

ImageSolution方法:

public static Bitmap ImageSolution (Bitmap bitmap, ImageView imageView){
    int width = bitmap.getWidth();
    int height = bitmap.getHeight();
    int newWidth = imageView.getWidth();
    int newHeight = imageView.getHeight();

    float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;

    Matrix matrix = new Matrix();
    matrix.postScale(scaleWidth, scaleHeight);

    Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width,
            height, matrix, true);
    return resizedBitmap;
}

地址为http://p2.zhimg.com/10/7b/107bb4894b46d75a892da6fa80ef504a.jpg

非常感谢你。

4 个答案:

答案 0 :(得分:1)

您可以使用谷歌推荐的名为Glide的第三方库。要添加此库,请在模块应用程序的build.gradle文件中添加以下依赖项。

dependencies {
    compile 'com.github.bumptech.glide:glide:3.5.2'
    compile 'com.android.support:support-v4:22.0.0'
}

然后你可以按照以下方式简单地加载图片

Glide.with(context)
    .load(news.getImageUrl())
    .into(newsImage);

答案 1 :(得分:0)

为什么不使用Picasso库?

它真的很容易使用

Picasso.with(context).load(news.getImageUrl()).into(newsImage);

它提供缓存和图像转换。

答案 2 :(得分:0)

在适配器类中创建一个viewHolder类,

private static class ViewHolder {
    public TextView newsTitle = null;
    public ImageView newsImage = null;
}

然后编写你的getView代码,

public View getView(final int position, View convertView, ViewGroup parent) {

    final ViewHolder itemHolder;
    View view = convertView;
    if (view == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        itemHolder = new ViewHolder();
        view = inflater.inflate(layoutResID, parent, false);

        itemHolder.newsImage = (ImageView) view.findViewById(R.id.news_image);
        itemHolder.newsTitle = (TextView) view.findViewById(R.id.news_title);


        view.setTag(itemHolder);
    } else {
        itemHolder = (viewHolder) view.getTag();
    }

    News news = getItem(position);

    itemHolder.newsTitle.setText(news.getTitle());
    bitmap = HttpUtil.sendImageRequest(news.getImageUrl());
    itemHolder.newsImage.setImageBitmap(ImageUtility.ImageSolution(bitmap, newsImage));


    return view;
}

或者,你可以使用毕加索,它很容易使用......

在依赖项中添加此行,

compile 'com.squareup.picasso:picasso:2.5.0'

用于加载用于加载图像的图像代码,

Picasso.with(context).load(news.getImageUrl()).into(itemHolder.newsImage);

答案 3 :(得分:0)

bitmap = HttpUtil.sendImageRequest(news.getImageUrl());

位图将始终为空,因为它是图像请求。该函数启动一个线程但立即返回。所以返回一个空位图。

newsImage.setImageBitmap(ImageUtility.ImageSolution(bitmap, newsImage));

如果您尝试将该空位图设置为imageview,则会出错。

重新设计您的应用。只有当线程完成时才有一个有效的位图。然后你可以使用它。