嗨,我有在Android的HTTP一個奇怪的問題。 我試圖從遠程服務器獲取圖片並將其顯示在設備上。 如果圖片是一個小的JPEG,這不是一個問題。但如果圖片變大,它將不起作用(只顯示部分圖片)。HTTP GET請求缺少數據
這裏是我完整的演示代碼:
public class HTTP_testActivity extends Activity {
private ImageView ivPicture;
private Button btGetImage;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ivPicture = (ImageView) findViewById(R.id.ivpiture1);
btGetImage = (Button) findViewById(R.id.btGetPicture1);
btGetImage.setOnClickListener(new Button.OnClickListener()
{
public void onClick(View arg0)
{
URI uri;
try {
uri = new URI("");
URLConnection connection = uri.toURL().openConnection();
connection.setUseCaches(true);
connection.connect();
BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());
Log.d("TEST","Length of Input " +bis.available());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.d("TEST","Length of Input after wait " +bis.available());
byte[] data = new byte[640*480*5];
bis.read(data);
Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, jdata.length);
if (bmp != null)
{
ivPicture.setImageBitmap(bmp);
}
bis.close();
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
Log.d("TEST", e.getMessage());
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
Log.d("TEST", e.getMessage());
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
Log.d("TEST", e.getMessage());
e.printStackTrace();
}
}
});
}
有人可以看到我在做什麼錯? 我已經想通了,到目前爲止是:bis.available()返回從來沒有超過65KB以上。儘管InputStream本身具有正確的長度(見調試器)。
請不要在UI線程做網絡I/O。當服務器變得有點慢時,你的應用程序將被OS關閉。有很多關於如何在Andriod上異步處理網絡的教程。 – 2012-03-15 13:15:20
如果你真正閱讀量雙報告爲可用,並bis.available()則報告說,更多的是可用?換句話說,你有沒有考慮過一段時間(bis.available()> 0)循環?除非事先知道所需的大小,否則可能需要稍微調整一下字節緩衝區,在這種情況下,您可以創建足夠大的緩衝區以便開始使用,並且只需使用隨每次讀取而前進的開始偏移量。 – JTeagle 2012-03-15 13:17:51