如何从网址加载图片

时间:2010-12-01 04:35:13

标签: java android

我正在为Android编写一个小图片框架应用程序,它正在使用opengl作为UI的一部分。这部分需要从flickr获取图像并将它们加载到纹理中。我下面的代码大多数时候都是函数,但它在从连接获取输入流和解码流的位图工厂之间有一个Thread.sleep()kludge:

            URL url = new URL("http://farm5.static.flickr.com/4132/5168797476_7a85deb2be_b.jpg");
            URLConnection con = url.openConnection();
            InputStream is = con.getInputStream();
            Thread.sleep(250); //What am I actually waiting for?
            sourceBitmap = BitmapFactory.decodeStream(is);

如何使用sleep()方法来支持具有逻辑意义的东西?

我正在测试不在模拟器中的三星Galaxy选项卡

2 个答案:

答案 0 :(得分:0)

我认为您应该实施 AsyncTask 。请参阅:http://developer.android.com/resources/articles/painless-threading.html

public void onClick(View v) {
  new DownloadImageTask().execute("http://example.com/image.png");
}

private class DownloadImageTask extends AsyncTask<string, void,="" bitmap=""> {
     protected Bitmap doInBackground(String... urls) {
         return loadImageFromNetwork(urls[0]);
     }

     protected void onPostExecute(Bitmap result) {
         mImageView.setImageBitmap(result);
     }
 }

我希望它可以帮到你!!

答案 1 :(得分:0)

这似乎不太理想,但是如果你逐字节地将数据流读入缓冲区,然后将字节数组传递给BitmapFactory,它就可以正常工作。

            URL url = new URL("http://farm5.static.flickr.com/4132/5168797476_7a85deb2be_b.jpg");
            URLConnection con = url.openConnection();
            con.connect();
            int fileLength = con.getContentLength();
            InputStream is = con.getInputStream();
            byte[] bytes = new byte[fileLength];
            for(int i=0;i<fileLength;i++) {
                bytes[i] = (byte)is.read();
            }
            sourceBitmap = BitmapFactory.decodeByteArray(bytes, 0, fileLength);

我尝试使用is.read(bytes,0,fileLength)一次性将字节读入缓冲区,但除非我在调用read之前等了一会儿,否则它不能完全填充缓冲区。是否有可能Android实现的InputStream的读取方法存在缺陷,导致BitmapFactory的decodeStream方法由于数据不完整而失败?