簡體   English   中英

在Android 4.2上,httpurlconnection非常慢

[英]httpurlconnection is very slow on Android 4.2

我可以使用httpurlconnection成功連接,發送和接收數據。 但是在我的手機(三星s4,4.2)和Android 4.2模擬器上加載所有數據需要很長時間。 但是在Android 2.3.x模擬器上加載圖片需要大約1-2秒(這是非常快的)。 在http連接上比我的galaxy s4更快。

我正在使用AsyncTask,我的代碼在兩者上運行良好。 它在android 4.2s上速度很慢。 我嘗試刪除chunkedStreaming,保持活着,更改超時值等但仍然沒有成功

這是我的代碼

HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                 urlConnection.setRequestMethod("POST");
                 urlConnection.setDoOutput(true);
                 urlConnection.setDoInput(true); 

                 urlConnection.setUseCaches(false);
                 urlConnection.setChunkedStreamingMode(0);
                 urlConnection.setRequestProperty("Connection", "Keep-Alive");
                 urlConnection.setConnectTimeout(6000);
                 urlConnection.setReadTimeout(6000);
                 urlConnection.setRequestProperty("Content-Type", "multipart/form-data;charset=UTF-8;boundary="+boundary);

                 urlConnection.connect();

4.2和2.3.x的httpurlconnections之間有什么區別嗎? 這里錯了

UPDATE!

我通過使用Log.e()來測試哪一行占用了大部分時間。

///// other staff
////......
                     Log.e("HTTP","3");

                 if (isCancelled())
                        return (null); // don't forget to terminate this method
                 Log.e("HTTP","3");
                 //Output
                    DataOutputStream outputStream = new DataOutputStream( urlConnection.getOutputStream() );
                    //Send Passcode
                    Log.e("HTTP","4");

在3到4之間,線上有5-6秒的傳球

DataOutputStream outputStream = new DataOutputStream( urlConnection.getOutputStream() );

UPDATE!

等待時間(參見上一次更新)與urlConnection.setConnectTimeout(6000)相關;

當我使超時1000,然后快速連接響應(等待1秒的線路)

DataOutputStream outputStream = new DataOutputStream( urlConnection.getOutputStream() );

不知道為什么會這樣

將urlConnection.setConnectTimeout()設置為較低的超時。

URLConnection.setConnectTimeout()的類文檔說:

設置連接時等待的最長時間(以毫秒為單位)。 如果在建立連接之前超時,則連接到服務器將失敗並出現SocketTimeoutException。 默認值0使我們進行阻塞連接。 這並不意味着我們永遠不會超時,但這可能意味着您將在幾分鍾后獲得TCP超時。

警告:如果主機名解析為多個IP地址,則此客戶端將按RFC 3484順序嘗試每個IP地址。 如果連接到這些地址中的每一個都失敗,則在連接嘗試引發異常之前將經過多次超時。 支持IPv6和IPv4的主機名始終至少有2個IP地址。

我最初設置為urlConnection.setConnectTimeout(30000); 然后將其更改為urlConnection.setConnectTimeout(1000) 我立刻看到了更快的結果。

希望這可以幫助!

您提到您正在使用AsyncTask ,您是否嘗試同時運行多個任務?

如果是這種情況,您應該知道從Android 4.0開始, AsyncTasks默認是序列化的。 這意味着執行程序將一次運行一個任務

如果要保留以前的行為,可以使用以下構造:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
  myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
else {
  myTask.execute();
}

有關更多信息,請參閱此博客文章:
http://commonsware.com/blog/2012/04/20/asynctask-threading-regression-confirmed.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM