如何为imageView设置来自URL的图像

31

你可以使用ImageLoader类,或者参考一些链接来了解如何从URL获取图像? - Piyush
1
解决问题的努力不足。 - Ravi Bhatt
请查看此解决方案 - Alireza Noorali
11个回答

67

编辑:

创建一个继承AsyncTask的类。

public class ImageLoadTask extends AsyncTask<Void, Void, Bitmap> {

    private String url;
    private ImageView imageView;

    public ImageLoadTask(String url, ImageView imageView) {
        this.url = url;
        this.imageView = imageView;
    }

    @Override
    protected Bitmap doInBackground(Void... params) {
        try {
            URL urlConnection = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) urlConnection
                    .openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            Bitmap myBitmap = BitmapFactory.decodeStream(input);
            return myBitmap;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

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

}

并且可以像这样调用:new ImageLoadTask(url, imageView).execute();

直接方法:

使用此方法并将您的网址作为字符串传递。它返回一个位图。 将位图设置到您的ImageView中。

public static Bitmap getBitmapFromURL(String src) {
    try {
        Log.e("src",src);
        URL url = new URL(src);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream input = connection.getInputStream();
        Bitmap myBitmap = BitmapFactory.decodeStream(input);
        Log.e("Bitmap","returned");
        return myBitmap;
    } catch (IOException e) {
        e.printStackTrace();
        Log.e("Exception",e.getMessage());
        return null;
    }
}

然后像这样将其应用于ImageView:

imageView.setImageBitmap(getBitmapFromURL(url));

不要忘记在清单文件中添加这个权限。

<uses-permission android:name="android.permission.INTERNET" />

注意:

由于我们正在执行网络操作,请尝试从另一个线程或AsyncTask中调用此方法。


在第一种方法中,不要直接从onPostExecute设置imageView,而是使用imageView.post(new Runnable() { public void run() { imageView.setImageBitmap(result); } });。 - Tushar Nallan
@Tushar 不需要这样做,onPostExecute() 方法会在 UI 线程中调用。 - kalyan pvs
你是个天才,应该得到一切。哈哈哈 - FuriosoJack
对于直接方法,您需要在 onCreate 方法中添加以下代码:StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); - S Kumar

50

您也可以让Square的Picasso库来完成繁重的工作:

Picasso
    .get()
    .load("http://...")
    .into(imageView);

作为额外福利,您将获得缓存、转换等功能。

但它适用于.png类型的图像URL,对于.svg URL或任何其他URL对我来说都不起作用。如果有任何解决方法,请分享!!! - Tarit Ray

9

就像宝石一样好用! - vss

8
使用Glide库:

使用Glide库:

Glide.with(context)
  .load(new File(url)
  .diskCacheStrategy(DiskCacheStrategy.ALL)
  .into(imageView);

5

你可以使用 Picasso 或者 Glide

Picasso.get()
   .load(your_url)
   .into(imageView);


Glide.with(context)
   .load(your_url)
   .into(imageView);

1

使用Aquery库的简单方法,它有助于直接从url加载图像。

AQuery aq=new AQuery(this); // intsialze aquery
 aq.id(R.id.ImageView).image("http://www.vikispot.com/z/images/vikispot/android-w.png");

1

针对一行代码程序员,

imageView.setImageBitmap(BitmapFactory.decodeStream(new URL("https://www.vectortemplates.com/raster/batman-logo-big.gif").openConnection().getInputStream()));

这会阻塞主/UI线程吗?我是Java新手。 - Mattwmaster58
没错,如果图像尺寸很大的话,这是有道理的。 - ʀᴀʜɪʟ

1
尝试使用SimpleDraweeView库。
<com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/badge_image"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />

现在你可以简单地执行以下操作:

 final Uri uri = Uri.parse(post.getImageUrl());

0

使用最新版本的Picasso(在撰写本答案时为2.71828),with方法已被弃用。

因此,正确的方式应该是-

Picasso.get().load("https://<image-url>").into(imageView);

其中imageView是您想要加载图像的ImageView


0
如果你正在制作一个RecyclerView并使用适配器,对我有效的方法是:
@Override
public void onBindViewHolder(ADAPTERVIEWHOLDER holder, int position) {
    MODEL model = LIST.get(position);
    holder.TEXTVIEW.setText(service.getTitle());
    holder.TEXTVIEW.setText(service.getDesc());

    Context context = holder.IMAGEVIEW.getContext();
    Picasso.with(context).load(model.getImage()).into(holder.IMAGEVIEW);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接