12

httpurlconnection を使用して、正常に接続し、データを送受信できます。しかし、私の電話 (Samsung 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 に違いはありますか? ここで何が問題なのですか

アップデート!

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

アップデート!!

その待機時間 (以前の更新を参照) は、urlConnection.setConnectTimeout(6000); に関連しています。

タイムアウトを 1000 にすると、接続がすばやく応答します (回線を 1 秒待ちます)。

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

なぜこれが起こっているのか分かりません

4

2 に答える 2

4

urlConnection.setConnectTimeout() をより低いタイムアウトに設定します。

URLConnection.setConnectTimeout() のクラス ドキュメントには、次のように記載されています。

接続中に待機する最大時間をミリ秒単位で設定します。接続が確立される前にタイムアウトが経過すると、サーバーへの接続は SocketTimeoutException で失敗します。デフォルト値の 0 により、ブロッキング接続が行われます。これは決してタイムアウトしないという意味ではありませんが、おそらく数分後に TCP タイムアウトが発生することを意味します。

警告: ホスト名が複数の IP アドレスに解決される場合、このクライアントは RFC 3484 の順序でそれぞれを試行します。これらの各アドレスへの接続が失敗した場合、接続試行が例外をスローする前に、複数のタイムアウトが経過します。IPv6 と IPv4 の両方をサポートするホスト名には、常に少なくとも 2 つの IP アドレスがあります。

私はもともと私のものをに設定してからurlConnection.setConnectTimeout(30000);、に変更しましたurlConnection.setConnectTimeout(1000)。すぐに、私はより速い結果を見ました。

お役に立てれば!

于 2013-11-20T22:54:45.833 に答える