-
phenomenon
- Сообщения: 22
- Зарегистрирован: 17 апр 2013, 17:59
Сообщение
phenomenon » 24 фев 2014, 17:22
Странная проблема, может это баг андроийда какой-то.
Написал приложение на андройде, которое в частности делает http пост запрос на некий сервер. Время ответа 0.8 - 1 секунда примерно.
Тоже самое приложение на айфоне ,время запроса 0.3-0.4 секунды.
Если делаю запрос через бразузер тоже 0.3-0.4 секунды.
code:
Код: Выделить всё
public void postData() {
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://www.yoursite.com/script.php");
try {
// Add your data
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("id", "12345"));
nameValuePairs.add(new BasicNameValuePair("stringdata", "AndDev is Cool!"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
}
}
читал эту тему
http://stackoverflow.com/questions/3046 ... econds-why ниче не помогает
-
altwin
- Сообщения: 1951
- Зарегистрирован: 13 ноя 2013, 14:46
Сообщение
altwin » 25 фев 2014, 11:04
[syntax=java5]
HttpClient httpclient = new DefaultHttpClient();
HttpParams httpParameters = httpclient.getParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(httpParameters, WAIT_RESPONSE_TIMEOUT);
HttpConnectionParams.setTcpNoDelay(httpParameters, true);
[/syntax]
TCP_NODELAY
-
phenomenon
- Сообщения: 22
- Зарегистрирован: 17 апр 2013, 17:59
Сообщение
phenomenon » 25 фев 2014, 13:56
не помогает.
еще проблема , что https запрос больше берет чем http.
Код: Выделить всё
package com.example.sdktest;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.KeyStore;
import java.util.Timer;
import java.util.TimerTask;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
import org.json.JSONObject;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.PowerManager;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.TextView;
import android.app.Activity;
import android.content.Context;
public class MainActivity extends Activity{
Button btn,btn2;
Timer timer;
long startTime,endTime,totalTime;
TextView text;
StringBuffer log;
CheckBox chk;
boolean active = false;
String url = "my url";
final static int TIMEOUT_MILLISEC = 50000;
protected PowerManager.WakeLock mWakeLock;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
this.mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
this.mWakeLock.acquire();
setContentView(R.layout.activity_main);
btn = (Button)findViewById(R.id.button1);
btn2 = (Button)findViewById(R.id.button2);
text = (TextView) findViewById(R.id.textView1);
log = new StringBuffer();
chk = (CheckBox) findViewById(R.id.checkBox1);
chk.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
// TODO Auto-generated method stub
if (arg1)
url = //my https url;
else
url = //my http url;
runOnUiThread(new Runnable() {
public void run()
{
log.append("Server: " + url + "\n");
text.setText(log.toString());
}
});
}
});
chk.setChecked(true);
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if (!active)
{
active = true;
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
// Your database code here
serverRequest();
}
},0, 2*1000);
}
}
});
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if (active)
timer.cancel();
active = false;
}
});
}
public void serverRequest()
{
Log.e("mylog", "serverRequest");
runOnUiThread(new Runnable() {
public void run()
{
log.append("serverRequest \n");
text.setText(log.toString());
new CheckSetting().execute(url);
}
});
}
public static HttpClient getNewHttpClient() {
try {
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null, null);
SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
//SSLSocketFactory sf = SSLSocketFactory.getSocketFactory();
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
HttpParams params = new BasicHttpParams();
//time out
HttpConnectionParams.setConnectionTimeout(params,
TIMEOUT_MILLISEC);
HttpConnectionParams.setSoTimeout(params, TIMEOUT_MILLISEC);
HttpConnectionParams.setTcpNoDelay(params, true);
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https", sf, 443));
ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);
return new DefaultHttpClient(ccm, params);
} catch (Exception e) {
return new DefaultHttpClient();
}
}
protected class CheckSetting extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
String response = "";
for (String url : urls) {
HttpClient client = getNewHttpClient();
try {
HttpGet httpGet = new HttpGet(url);
startTime = System.currentTimeMillis();
HttpResponse execute = client.execute(httpGet);
InputStream content = execute.getEntity().getContent();
BufferedReader buffer = new BufferedReader(
new InputStreamReader(content));
String s = "";
while ((s = buffer.readLine()) != null) {
response += s;
}
} catch (Exception e) {
e.printStackTrace();
}
}
return response;
}
@Override
protected
// this call back if after checking from server
void onPostExecute(String result) {
endTime = System.currentTimeMillis();
totalTime = endTime - startTime;
runOnUiThread(new Runnable() {
public void run()
{
log.append("get Json from server. request take " + String.valueOf(totalTime) + "msec \n");
text.setText(log.toString());
}
});
Log.e("mylog", "get Json from server. request take " + String.valueOf(totalTime) + "msec");
}
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.e("mylog","stop");
timer.cancel();
}
}
картинка запроса.
-
altwin
- Сообщения: 1951
- Зарегистрирован: 13 ноя 2013, 14:46
Сообщение
altwin » 25 фев 2014, 16:18
Вместо
String s = ""; в методе
CheckSetting это:
StringBuilder s = new StringBuilder();
Итого вместе с циклом:
[syntax=java5]
String response = null;
String line = null;
StringBuilder s = new StringBuilder();
while ((line = reader.readLine()) != null)
{
s.append(line + "\n");
}
response = s.toString();
[/syntax]
 Переменные
s и
response из вашего кода, line новая, замените и все.
P.S. другие части не имеющие отношение непосредственно к запросу я не смотрел, но вообще используйте лучше это:
https://github.com/mcxiaoke/android-volley или это:
http://loopj.com/android-async-http/