2010-12-01 203 views
2

我正在爲使用opengl作爲UI部分的android編寫一個小圖片框架應用程序。這部分需要從flickr獲取圖像並將其加載到紋理中。我有下面的代碼是功能性的大部分時間,但它有一個Thread.sleep()方法雜牌在得到從這個連接的輸入流和位圖工廠流解碼之間:如何從網址加載圖片

  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 Tab上不是在模擬器

回答

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讀取的字節到緩衝區中一次全部(字節,0,文件長度),但它並沒有可靠的完全填充緩衝,除非我調用read前等了一會兒。 InputStream的read方法的android實現有可能存在缺陷,導致BitmapFactory的decodeStream方法由於不完整的數據而失敗?

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); 
    } 
} 

我希望它可以幫助你!

+0

異步下載圖像當然是一個好主意,但是,它並沒有真正解決實際問題 – 2010-12-02 03:41:35