Android - 使用asynctask创建json对象

时间:2012-07-17 12:03:19

标签: android json

我有以下代码: (基本上它创建了各种JSONObjects(Beneficiario)并将它们全部放在另一个JSONObject(proposta)中。我没有在这里显示它但是我在之前创建了游标(ppt,c)

            if (ppt.getString(45).equals("0")) {
                int i = 0;

                c.moveToFirst();
                JSONObject ben = new JSONObject();
                try {
                    while (c.isAfterLast() == false) 
                    {
                        i++;
                        ben.put("b_nome" + i, c.getString(1));
                        ben.put("b_telefone" + i, c.getString(2));
                        ben.put("b_nif" + i, c.getString(3));
                        ben.put("b_bi" + i, c.getString(4));
                        ben.put("b_codigopostal" + i, c.getString(5));
                        ben.put("b_localidade" + i, c.getString(6));
                        ben.put("b_morada" + i, c.getString(7));                        
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                proposta.put("beneficiario" + i, ben);
            }

它给出了一个outofmemory错误,我猜这是因为我在主线程上运行它。 你能给我一个帮助/一些代码来使用线程或asynctask吗?

2 个答案:

答案 0 :(得分:3)

c.moveToNext();循环中使用While。您的Cursor正在运行无限。

答案 1 :(得分:0)

使用像这样的异步任务:

// You must provide types for the three generic parameters before the code will compile.          
// For more details, see http://developer.android.com/reference/android/os/AsyncTask.html 
 private class MoveOutOfUIthread extends AsyncTask<
                Params, // one or more values of this type are passed to doInBackground()
                Progress, // the type of the progress units published during background crunching.
                Result // the type of the result returned by doInBackground()
                > 
 {

         protected Integer doInBackground(Params... p1, p2, p3) {
             // your background task here
             Result result = new Result();
             return result;
         }

         protected void onPostExecute(Result r) {
             // this gets the object returned by doInBackground, and executes on the UI thread
         }
 }   

* 执行如下的异步任务:*

new MoveOutOfUIthread().execute(p1, p2, p3);

它不是代理传递参数你可以简单地做到这一点:

new MoveOutOfUIthread().execute();

注意:您无法更改doInBackground中的UI元素。您必须将代码放在更改用户界面的onPreExecuteonPostExecute中。

更新:

这是在后台线程中运行代码。根据您的OutOfMemory错误,我认为您应该在c.moveToNext();回答时使用M Mohsin Naeem