Android JSON从数据库读取4700条记录
我的android应用程序使用以下代码从web上使用JSONArray的mysql数据库中读取和导入4700条记录:Android JSON从数据库读取4700条记录,android,json,Android,Json,我的android应用程序使用以下代码从web上使用JSONArray的mysql数据库中读取和导入4700条记录: @Override protected String doInBackground(Void... params) { try{ httpclient = new DefaultHttpClient(); HttpGet httpget = new HttpGet("http:
@Override
protected String doInBackground(Void... params) {
try{
httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet("http://www.example.com/preleva_prodotti.php");
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
is = entity.getContent();
}catch(Exception e){
//Log.e("log_tag", "Error in http connection "+ e.toString());
httpclient.getConnectionManager().shutdown();
return result = "no_server";
}
//convert response to string
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
StringBuilder sb = new StringBuilder();
String line = null;
String k = reader.readLine();
while ((line = k) != null) {
sb.append(line + "\n");
}
is.close();
result=sb;
}catch(Exception e){
return result = "no_server";
}
//parse json data
try{
JSONObject json= new JSONObject(result);
JSONArray jArray = json.getJSONArray("array");
return is_full="ok_insert";
}catch(JSONException e){
Log.e("log_tag", "Error parsing data "+e.toString());
return is_full = "no_dati";
}
}
但在这一行:
while ((line = k) != null) {
sb.append(line + "\n");
}
出现错误:内存不足。
如何解决这个问题?我对Java不太熟悉,请耐心听我说,但这似乎与语言无关 也就是说,问题似乎是
k
从未更新过。一旦分配了k
(k=reader.readLine()
),您就(无限期地)重新分配line
相同的值(从而无限循环,从而内存不足)
我想你在寻找:
String k = reader.readLine();
while ((line = k) != null) {
sb.append(line + "\n");
k = reader.readLine(); // or some facsimile
}
请注意,我现在重新分配
k
(虽然我不确定有k
=行的冗余性;似乎是对变量的浪费,imho)除非,k
以某种方式成为调用reader.readLine()
的同义词,这是我看到的问题……不,问题出现在sb.append行中,因为k对于StringBuilder来说太长了,但我不知道如何解决这个问题……您可以肯定的是,line
的值太大,不是说sb
达到了缓冲区阈值吗?我发现很难相信文件的一行超出了Append
方法的容量,但我相信你的话。话虽如此,我还是想用streams来避免它。@Brad是正确的,你的代码中有一个无限循环,你在读取这样一行json文件时会出现oom错误。在你的代码中,你试图将所有json文本存储在string对象中,然后开始将其解析为json。一些json库(jackson,gson)支持流解析。所以我认为流解析可以解决你的记忆问题。通过流式解析,您可以开始解析json,而无需在内存中输入所有数据。不一次导入4700条记录如何,您可能会耗尽应用程序或手机的所有内存。我会分块查询。