在練習使用 HttpURLConnection 來取得指定 URL 網址內容時,發現透過 Android 模擬器跑得非常非常緩慢,但我把相同的 Java Code 用桌機的環境執行,卻十分快速,讓我不禁感到奇怪,難道這是模擬器的問題嗎?還是初始化網路連線所耗的資源問題呢?
後來看到一則文章:Re: [android-developers] Re: First HTTP/S requests are slow. [Android 1.5] - msg#03831,看到了解法!
原來我寫得程式碼:
String n, result="";
while( ( n = reader.readLine() ) != null )
result += n;
文章提到的寫法:
String n, result="";
StringBuilder htmlContent = new StringBuilder();
while ((n = reader.readLine()) != null)
htmlContent.append(n);
result = htmlContent.toString();
這兩者的速度至少差 20 倍啊!讓我寫得程式從原先要等約 130 秒,瞬間變成只要等五秒,真是太神奇了。我的 CPU 是 AMD X4 945 + 4GB 記憶體,也不見得會跑很慢才是,因此找了不少文章,才發現是寫法與模擬器的影響吧。程式還包括網路連線,變數很多,很難找出此點。
完整的程式碼:
HttpURLConnection con = null;
try
{
URL url = new URL("http://tw.yahoo.com");
con = (HttpURLConnection) url.openConnection();
con.setReadTimeout(10000);
con.setConnectTimeout(15000);
con.setRequestMethod("GET" );
con.addRequestProperty("User-Agent","Mozilla/5.0 (Windows; U; Windows NT 5.2; en-GB; rv:1.9.2.9) Gecko/20100824 Firefox/3.6.9");
con.setDoInput(true);
con.connect();
BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8" ));
String n, result="";
// while( ( n = reader.readLine() ) != null )
// result += n;
StringBuilder htmlContent = new StringBuilder();
while ((n = reader.readLine()) != null)
htmlContent.append(n);
result = htmlContent.toString();
}
}catch(Exception e)
{
}
finally
{
if ( con != null )
con.disconnect();
}
沒有留言:
張貼留言