Android JSON从数据库读取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:

我的android应用程序使用以下代码从web上使用JSONArray的mysql数据库中读取和导入4700条记录:

@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条记录如何,您可能会耗尽应用程序或手机的所有内存。我会分块查询。