我有一个与WebService
通信的Android应用程序。我的应用程序向Web服务发送请求,该请求以php
编写。 php方面,只需处理echo
格式的请求和JSON
结果。
虽然传输的数据量很少,但有时在我的应用中加载数据需要很长时间。
以下是我的Android应用中的方法,负责发送请求和检索响应
/**
* Posts data to server.
*
* @param url Server URL
* @param json {@link JSONObject} to be sent
* @param tag Tag. used to describe the request
* @return {@link HttpResponse}
* @throws IOException
* @throws ClientProtocolException
*/
public HttpResponse postData(String url, JSONObject json, String tag)
throws ClientProtocolException, IOException {
SharedPreferences prefs = context.getSharedPreferences(SUPPORTDESK, Context.MODE_PRIVATE);
HttpResponse httpResponse = null;
String jsonString = json.toString();
String encodedURL = URLEncoder.encode(jsonString, HTTP.UTF_8);
List<NameValuePair> value = new ArrayList<NameValuePair>();
value.add(new BasicNameValuePair("username", prefs.getString(USERNAME_KEY, "")));
value.add(new BasicNameValuePair("password", prefs.getString(PASSWORD_KEY, "")));
value.add(new BasicNameValuePair("tag", tag));
value.add(new BasicNameValuePair("data", encodedURL));
DefaultHttpClient httpClient = new DefaultHttpClient();
//setTimeout(httpClient, 5000);
HttpPost request = new HttpPost(url);
// StringEntity entity = new StringEntity(jsonString);
// request.setHeader("Content-Type", "application/json");
// request.setEntity(entity);
request.setEntity(new UrlEncodedFormEntity(value, HTTP.UTF_8));
httpResponse = httpClient.execute(request);
return httpResponse;
}
/**
* Retrieves String representation of {@link HttpResponse}
*
* @param response {@link HttpResponse}
* @return <b>String</b> Actual Response from server as string.
* @throws IOException
* @throws IllegalStateException
* @throws UnsupportedEncodingException
*/
public static String getServerResponse(HttpResponse response)
throws IOException, IllegalStateException,
UnsupportedEncodingException {
InputStream is = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(is,
HTTP.UTF_8), 100);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
String out = URLDecoder.decode(sb.toString().trim(), HTTP.UTF_8).trim();
int ascii = (int) out.charAt(0);
return (ascii >= 33 & ascii <= 126)?out:out.substring(1);
}
postData
方法将发送请求并等待响应,然后响应将传递给getServerResponse
以检索响应的字符串表示。当然,所有long-Running
代码都包含在AsyncTask
类中。
以下是我的网络服务的示例方法:
function transactionDetail($json) {
$array = json_decode($json, TRUE);
$db = new DBHelper();
$transactionId = $array[$db->JS_RP_TRANSACTION_ID];
$response = $db->getTransactionDetails($transactionId);
echo urlencode(json_encode($response));
}
那么,我正在 Android Side 上使用的方法来发出请求并检索响应,标准方法,或者有更好的方法?
如何为我发出的请求设置超时?,您可以在我的代码中看到一条注释行,我试图设置超时但是它破坏了代码。
Client/Server side
代码的组合我使用得还不够,还是有更多标准或改进的方法来实现这个我不知道的?
答案 0 :(得分:2)
我使用完全相同的代码来更新我的应用程序中的数据库,我使用php / echo / json发送大量数据,而且我唯一一次遇到减速的时候是因为网速很低或者服务器变慢。
升级到更好的服务器后,此操作只需几秒钟即可完成,即手机上的信号强度变低,数据传输速度变慢,拨号速度降低或更低......
您的PHP代码和java代码是正确的,我怀疑问题出在你的服务器上。您应该在手机处于Wi-Fi状态时进行测试,以获得良好的信号强度以排除网速,并测试您的数据库HELPER在php中获取结果需要多长时间。如果它的SQL连接而不是Mongo或其他东西,它应该比50ms更快地工作,即使是10 000行的结果。 (根据我自己的经验)