如何在Android中通过URL加载ImageView?

572

如何在ImageView中使用通过URL引用的图片?


1
尝试这个:https://dev59.com/QG3Xa4cB1Zd3GeqPcDeG#15797963 - comeGetSome
2
使用Picasso...https://dev59.com/h3E95IYBdhLWcg3wEpvo#23865531 - chiragkyada
公共类ImageDownloader { private final Executor executor = Executors.newSingleThreadExecutor(); public void download(String url, Consumer<Bitmap> onSuccess, Consumer<Exception> onError) { Handler handler = new Handler(); executor.execute(() -> { try (InputStream in = new URL(url).openStream()) { Bitmap result = BitmapFactory.decodeStream(in); handler.post(() -> onSuccess.accept(result)); } catch (Exception e) { handler.post(() -> onError.accept(e)); } }); } } - Sarsaparilla
23个回答

9

我最近在这里找到了一个帖子(链接),因为我需要为带有图像的列表视图做类似的事情,但原理很简单,正如你可以在那里阅读到的第一个示例类(由jleedev制作)。

您可以获得图像的输入流(来自网络)。

private InputStream fetch(String urlString) throws MalformedURLException, IOException {
    DefaultHttpClient httpClient = new DefaultHttpClient();
    HttpGet request = new HttpGet(urlString);
    HttpResponse response = httpClient.execute(request);
    return response.getEntity().getContent();
}

然后,您将图像存储为Drawable,并可以将其传递给ImageView(通过setImageDrawable)。再次从上面的代码片段中查看整个线程。

InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");

我的项目中没有DefaultHttpClient。 - Stepan Yakovenko

9

很抱歉回复晚了,如上所述,AsyncTask将会执行,并经过一番搜索,我找到了另一种解决方案。

Drawable drawable = Drawable.createFromStream((InputStream) new URL("url").getContent(), "src");

imageView.setImageDrawable(drawable);

这是完整的函数:

public void loadMapPreview () {
    //start a background thread for networking
    new Thread(new Runnable() {
        public void run(){
            try {
                //download the drawable
                final Drawable drawable = Drawable.createFromStream((InputStream) new URL("url").getContent(), "src");
                //edit the view in the UI thread
                imageView.post(new Runnable() {
                    public void run() {
                        imageView.setImageDrawable(drawable);
                    }
                });
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }).start();
}

不要忘记在你的 AndroidManifest.xml 中添加以下权限以访问互联网。

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

我自己尝试过,还没有遇到任何问题。


这对于极简主义者来说非常不错!只需记住,它需要在额外的“线程”中运行,因为UI线程不允许进行网络操作。 - creativecreatorormaybenot
收到一个错误 - 尝试在空对象引用上调用虚拟方法“boolean android.widget.ImageView.post(java.lang.Runnable)” - meekash55

8

6
imageView.setImageBitmap(BitmapFactory.decodeStream(imageUrl.openStream()));//try/catch IOException and MalformedURLException outside

5

这将帮助你...

定义ImageView并加载图像...

Imageview i = (ImageView) vv.findViewById(R.id.img_country);
i.setImageBitmap(DownloadFullFromUrl(url));

然后定义这个方法:
    public Bitmap DownloadFullFromUrl(String imageFullURL) {
    Bitmap bm = null;
    try {
        URL url = new URL(imageFullURL);
        URLConnection ucon = url.openConnection();
        InputStream is = ucon.getInputStream();
        BufferedInputStream bis = new BufferedInputStream(is);
        ByteArrayBuffer baf = new ByteArrayBuffer(50);
        int current = 0;
        while ((current = bis.read()) != -1) {
            baf.append((byte) current);
        }
        bm = BitmapFactory.decodeByteArray(baf.toByteArray(), 0,
                baf.toByteArray().length);
    } catch (IOException e) {
        Log.d("ImageManager", "Error: " + e);
    }
    return bm;
}

4

带有异常处理和异步任务的版本:

AsyncTask<URL, Void, Boolean> asyncTask = new AsyncTask<URL, Void, Boolean>() {
    public Bitmap mIcon_val;
    public IOException error;

    @Override
    protected Boolean doInBackground(URL... params) {
        try {
            mIcon_val = BitmapFactory.decodeStream(params[0].openConnection().getInputStream());
        } catch (IOException e) {
            this.error = e;
            return false;
        }
        return true;
    }

    @Override
    protected void onPostExecute(Boolean success) {
        super.onPostExecute(success);
        if (success) {
            image.setImageBitmap(mIcon_val);
        } else {
            image.setImageBitmap(defaultImage);
        }
    }
};
try {
    URL url = new URL(url);
    asyncTask.execute(url);
} catch (MalformedURLException e) {
    e.printStackTrace();
}

4
    String img_url= //url of the image
    URL url=new URL(img_url);
    Bitmap bmp; 
    bmp=BitmapFactory.decodeStream(url.openConnection().getInputStream());
    ImageView iv=(ImageView)findviewById(R.id.imageview);
    iv.setImageBitmap(bmp);

3
    private Bitmap getImageBitmap(String url) {
        Bitmap bm = null;
        try {
            URL aURL = new URL(url);
            URLConnection conn = aURL.openConnection();
            conn.connect();
            InputStream is = conn.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            bm = BitmapFactory.decodeStream(bis);
            bis.close();
            is.close();
       } catch (IOException e) {
           Log.e(TAG, "Error getting bitmap", e);
       }
       return bm;
    } 

3

这段代码已经测试过了,完全可用。

URL req = new URL(
"http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png"
);
Bitmap mIcon_val = BitmapFactory.decodeStream(req.openConnection()
                  .getInputStream());

3
请尝试以下方法,希望能帮助您解决问题。
这里介绍如何使用“AndroidQuery”外部库以异步任务方式从url /服务器加载图像,并将已缓存的图像保存到设备文件或缓存区域。
1.下载“AndroidQuery”库 单击此处 2.复制/粘贴此jar到项目lib文件夹中,并将此库添加到项目构建路径。
3.现在我来演示如何使用它。
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center">

        <FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <ImageView
                android:id="@+id/imageFromUrl"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:adjustViewBounds="true"/>
            <ProgressBar
                android:id="@+id/pbrLoadImage"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"/>

        </FrameLayout>
    </LinearLayout>

MainActivity.java

public class MainActivity extends Activity {

private AQuery aQuery;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    aQuery = new AQuery(this);
    aQuery.id(R.id.imageFromUrl).progress(R.id.pbrLoadImage).image("http://itechthereforeiam.com/wp-content/uploads/2013/11/android-gone-packing.jpg",true,true);
 }
}

Note : Here I just implemented common method to load image from url/server but you can use various types of method which can be provided by "AndroidQuery"to load your image easily.

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