我的Android应用程序正在调用经过身份验证的webservice API,以根据数据类型从服务器下载和同步记录。
例如:
应用程序为不同的内容类型(Commerce, Science, Arts
)循环调用API。
现在,对于每种内容类型,应用程序都会维护last sync date
,以便它可以在该日期之后同步数据,最后一个月。
API调用如下所示:
private void loadData(){
String apiUrl = "";
String[] classArray = { "Commerce", "Science", "Arts" };
try{
for(int classIndex = 0; classIndex < classArray.length; classIndex++){
apiUrl = "http://www.myserver.com/datatype?class="+classArray[classIndex]+"&syncDate="+lastSyncDate;
String responseStr = getSyncData(apiUrl);
// Code to parse the JSON data and store it in SqliteDB.
}
}catch (Exception e) {
e.printStackTrace();
}
}
private String getSyncData(String webservice){
String line = "", jsonString = "";
try{
URL url = new URL(webservice);
HttpURLConnection conn = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY); //using proxy may increase latency
conn.setInstanceFollowRedirects(false);
String userName = "abc@myserver.com", password = "abc123";
String base64EncodedCredentials = Base64.encodeToString((userName
+ ":" + password).getBytes(), Base64.URL_SAFE
| Base64.NO_WRAP);
conn.setRequestProperty("Authorization", "basic "+ base64EncodedCredentials);
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
while ((line = rd.readLine()) != null) {
// Process line...
return line;
}
rd.close();
}
}catch (Exception e) {
e.printStackTrace();
}
return jsonString;
}
此方法getSyncData()
返回JSON
响应,该响应将被解析并存储在SqliteDb
中。
此代码工作正常。但是当classArray
中有更多内容类型并且每个类都有大量数据集时,会出现轻微的性能问题。
我的问题是:
为了提高此过程的整体性能,我可以打开连接
到www.myserver.com
并使用API调用循环传递参数以停止为每种内容类型反复创建连接。
这里我使用HttpURLConnection
进行API调用,但可以使用java中的任何其他技术。
主要目的是使连接保持持久,以便应用程序不应为每次调用一次又一次地创建它,因为每个调用应用程序都会创建一个消耗更多时间的单独连接。
答案 0 :(得分:0)
我之前使用webcall -> parse JSON -> store DB -> show/update views
通过大量的测试和调试,我发现实际上正在减慢流程的是store DB
部分,与网络共享或JSON解析无关。
我通过将其更改为:
解决了这种情况 webcall -> parse JSON -> fire new thread to store DB -> show/update views
通过这个简单的改变,我的结果开始出现在1秒内(而不是之前的5到6秒)。
希望它有所帮助。
修改强>
关于连接本身,你可以使用网络套接字(这是持久的,但在Android中没有很好地实现,你将不得不做大量的手动解析),所以我建议首先测试数据库的东西。