我有以下代码: (基本上它创建了各种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吗?
答案 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元素。您必须将代码放在更改用户界面的onPreExecute
或onPostExecute
中。
更新:
这是在后台线程中运行代码。根据您的OutOfMemory错误,我认为您应该在c.moveToNext();
回答时使用M Mohsin Naeem
。