0

我想从互联网上获取照片,所以我使用 setImageURI,但似乎无法完成,但如果我在同一功能下使用 setImageResource(R.drawable.),它可以工作......我该如何解决 setImageURI 的错误?

public View getView(int position, View convertView, ViewGroup parent) {
        ImageView i = new ImageView(mContext);

        //this is working 
        int p = R.drawable.fb;
        i.setImageResource(p);

        //this is not working
        i.setImageURI(Uri.parse("http://www.vaultads.com/wp-content/uploads/2011/03/google-adsense.jpg"));


        return i;
    }
4

2 回答 2

1

想从互联网上获取照片,所以我使用 setImageURI,但似乎无法完成,但如果我使用 setImageResource(R.drawable.)

最重要的事情

setImageResource 是同步的,因此它会正确执行,但来自 URL 的 setImageURI 是异步操作,它必须在与 UI 线程不同的线程中执行

关注 Snippet 将对您有所帮助。

new Thread() {

    public void run() {
        try {
            url = new URL("http://www.vaultads.com/wp-content/uploads/2011/03/google-adsense.jpg");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        try {
            image = BitmapFactory.decodeStream(url.openStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
        runOnUiThread(new Runnable() {

            @Override
            public void run() {

                i.setImageBitmap(image);
            }
        });
    }
}.start();

如果这也不起作用,那么您还有其他三个选择

选项1

URL myUrl = new URL("http://www.vaultads.com/wp-content/uploads/2011/03/google-adsense.jpg");
InputStream inputStream = (InputStream)myUrl.getContent();
Drawable drawable = Drawable.createFromStream(inputStream, null);
i.setImageDrawable(drawable);

选项2

try {
  Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL("http://www.vaultads.com/wp-content/uploads/2011/03/google-adsense.jpg").getContent());
  i.setImageBitmap(bitmap); 
} catch (MalformedURLException e) {
  e.printStackTrace();
} catch (IOException e) {
  e.printStackTrace();
}

选项3

public static Bitmap loadBitmap(String url) {
    Bitmap bitmap = null;
    InputStream in = null;
    BufferedOutputStream out = null;

    try {
        in = new BufferedInputStream(new URL(url).openStream(), IO_BUFFER_SIZE);

        final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
        out = new BufferedOutputStream(dataStream, IO_BUFFER_SIZE);
        copy(in, out);
        out.flush();

        final byte[] data = dataStream.toByteArray();
        BitmapFactory.Options options = new BitmapFactory.Options();
        //options.inSampleSize = 1;

        bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,options);
    } catch (IOException e) {
        Log.e(TAG, "Could not load Bitmap from: " + url);
    } finally {
        closeStream(in);
        closeStream(out);
    }

    return bitmap;
}

   i.setImageBitmap(loadBitmap("http://www.vaultads.com/wp-content/uploads/2011/03/google-adsense.jpg")); 
于 2012-06-22T04:21:59.247 回答
0

该图片网址对我不起作用。

我建议从互联网下载图像的另一条路线。如果您从中调用setImageURIgetView它将在 UI 线程上运行,这将导致您的应用程序冻结,直到图像从网络返回。此外,图像不会被缓存,因此您可能会一遍又一遍地下载相同的图像。

查看这个适用于 Android 的ImageLoader库,它可以简化图片的下载。它在后台处理下载它们,它可以同时处理多个请求,并为您缓存图像。

于 2012-06-22T03:18:35.087 回答