我有一个 Android 应用程序,它的大部分功能都消耗 API。我的客户提示从 Web API 检索数据非常慢。我想知道是什么原因造成的。
以下是我调用电话的基本结构:
String returnString = "";
token = tokenBuilder.generateToken("Customers/All");
try {
HttpGet request = new HttpGet(apiUrl + "CustomerRewards/All?customerId=" + id);
request.setHeader(HTTP.CONTENT_TYPE, "application/json");
request.setHeader("AccountId", headerAccountId);
request.setHeader("StoreId", headerStoreId);
request.setHeader("AppKey", headerAppKey);
request.setHeader("Token", token);
HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(request);
String responseString = EntityUtils.toString(response.getEntity());
Log.i("Api Message", responseString);
returnString = responseString;
} catch (Exception e) {
returnString = e.getMessage();
}
return returnString;
我从进度对话框中调用此方法,以便在从 Web API 检索数据时显示加载程序。有一个更好的方法吗?或者我的 android 代码会影响它的性能吗?
这是调用进度对话框上的代码。
rewardsErrorMessage = "";
progressBar = new ProgressDialog(this);
progressBar.setCancelable(true);
progressBar.setMessage("Loading info ...");
progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressBar.setProgress(0);
progressBar.setMax(100);
progressBar.setCancelable(false);
progressBar.show();
apiLoadStatus = false;
new Thread(new Runnable() {
public void run() {
while (!apiLoadStatus) {
apiLoadStatus = RewardApi();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (apiLoadStatus) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
progressBar.dismiss();
}
}}).start();
progressBar.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
SetValues();
}
});
这里是实际调用连接到 Web api 的 api 类的方法
ApiConnection api = new ApiConnection();
try {
Log.i("CustomerId", customerInfos.getString("customer_id", ""));
transactionMessage = api.GetTransactions(customerInfos.getString("customer_id", ""));
availableRewardsMessage = api.GetCustomerRewards(customerInfos.getString("customer_id", ""));
try
{
if(transactionMessage.contains("Timestamp"))
{
Log.i("Transaction", "Success");
GetPoints(transactionMessage);
}
if(!availableRewardsMessage.equals("[]") && !availableRewardsMessage.equals("[]"))
{
JSONObject rewardsJson = new JSONObject(availableRewardsMessage);
availableRewardsMessage = rewardsJson.getString("AvailableRewards");
hasRewards = true;
}
return true;
}
catch(Exception e)
{
rewardsErrorMessage = transactionMessage.replace('[', ' ').replace(']', ' ').replace('"', ' ');
}
} catch(Exception e) {
e.printStackTrace();
rewardsErrorMessage = e.getMessage();
return true;
}
return true;
正如您所注意到的,我这里有两个 api 调用。
我真的很想加快数据检索速度。或者我正在使用的 api 这么慢吗?大家有什么想法吗?谢谢!
最佳答案
您可能知道,有许多因素会影响 HTTP 服务调用,客户端代码只是其中之一:
- 网络速度和延迟
- 服务器可用性和负载
- 数据负载大小
- 客户端设备资源
- 客户端代码
您确实需要确定瓶颈在哪里,以便知道在哪里尝试优化。此外,您应该确保服务器使用 Gzip 来压缩有效负载并将以下内容添加到您的客户端代码中:
request.setHeader("Accept-Encoding", "gzip");
关于java - Web API 调用太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22873501/