公告版位

新版部落格:blog.changyy.org

在練習使用 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();
}


changyy 發表在 痞客邦 PIXNET 留言(1) 人氣()


留言列表 (1)

發表留言
  • 赭
  • StringBuilder的更新是屬於串接,String的更新會重新洗掉再填入字元XD也因此造成了差異吧?
  • 是啊 :D

    changyy 於 2013/09/17 18:08 回覆