Java Asynctask:doInBackground中Asynctask和process的两个值
我正在尝试将值存储到我的数据库中,并使用AsyncTask来完成此过程。我从Web服务器中提取数据,并通过向async发送Json数组将其存储到DB,然后提取值并存储它们。我正在为循环设置这个 现在这些记录有时有子记录。识别本地数据库中的子记录。我正在添加另一个名为parentID的字段,因此我试图将parentID与jsonarray一起发送到AsyncTask。我不知道怎么做 以下是我迄今为止所做的:Java Asynctask:doInBackground中Asynctask和process的两个值,java,android,android-asynctask,Java,Android,Android Asynctask,我正在尝试将值存储到我的数据库中,并使用AsyncTask来完成此过程。我从Web服务器中提取数据,并通过向async发送Json数组将其存储到DB,然后提取值并存储它们。我正在为循环设置这个 现在这些记录有时有子记录。识别本地数据库中的子记录。我正在添加另一个名为parentID的字段,因此我试图将parentID与jsonarray一起发送到AsyncTask。我不知道怎么做 以下是我迄今为止所做的: private void getSubRecords(String recordID2)
private void getSubRecords(String recordID2)
{
final String parent_ID = recordID2;
final RequestParams requestParams = new RequestParams();
requestParams.put("RecId", recordID2);
final String urlforsubrec = getResources().getString(R.string.subreclink);
AsyncHttpClient client = new AsyncHttpClient();
client.post(urlforsubrec , requestParams, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
try {
success = response.getInt(TAG_SUCCESS);
if (success == Integer.parseInt(getResources().getString(R.string.successvalue))) {
details = response.getJSONArray(TAG_DETAIL);
new AddSubRecordAsyncTask().execute(details); //Need to send parentID String
我想发送家长ID和详细信息(JsonArray)?如何在AsyncTask中反映这一点?
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
super.onFailure(statusCode, headers, throwable, errorResponse);
Log.e("Error","Check internet"); }
});
}
下面是asyncTask(不确定要更改什么以同时反映JsonArray和String)
private class AddSubRecAsyncTask extends AsyncTask<JSONArray, Void, String>
{
@Override
protected String doInBackground(JSONArray... params)
{
for (int i = 0; i < params[0].length(); i++)
{
try
{
JSONObject c = details.getJSONObject(i);
riD = c.getString(TAG_RID);
rnAme = c.getString(TAG_RNAME);
rcHild = c.getString(TAG_RCHILD);
localDB.setSubRecDetails(riD, rnAme, rcHild, rcAtegory, parent_ID);
if (rcHild.equalsIgnoreCase(getResources().getString(R.string.subvalue))) {
getSubRecords(riD);
}
}
catch (JSONException e)
{
e.printStackTrace();
}
}
return null;
}
protected void onPostExecute(String object)
{
Log.e("All", "Done");
}
}
}
私有类AddSubRecAsyncTask扩展了AsyncTask
{
@凌驾
受保护字符串doInBackground(JSONArray…参数)
{
对于(int i=0;i
我想发送JsonArray(在我上面的代码“details”中)和字符串值(parent_ID),因为它是最终值
不知道该怎么做?我以前用过一种方法,也许不是最好的 您可以创建一个类来包含要发送到AsyncTask的所有信息,如下所示:
class ProcessTicket {
public final String parentId;
public final JSONArray data;
}
然后,可以将AsyncTask编写为:
private class AddSubRecAsyncTask extends AsyncTask<ProcessTicket, Void, String> {
protected String doInBackground(ProcessTicket... params){
...
}
}
私有类AddSubRecAsyncTask扩展了AsyncTask{
受保护的字符串doInBackground(进程票证…参数){
...
}
}
然后可以在doInBackground函数中提取所需的参数。我以前使用过一种方法,可能不是最好的方法 您可以创建一个类来包含要发送到AsyncTask的所有信息,如下所示:
class ProcessTicket {
public final String parentId;
public final JSONArray data;
}
然后,可以将AsyncTask编写为:
private class AddSubRecAsyncTask extends AsyncTask<ProcessTicket, Void, String> {
protected String doInBackground(ProcessTicket... params){
...
}
}
私有类AddSubRecAsyncTask扩展了AsyncTask{
受保护的字符串doInBackground(进程票证…参数){
...
}
}
然后,您可以在doInBackground函数中提取所需的参数。
AsyncTasks
是对象,因此您可以始终使用构造函数偷偷地插入一些额外的数据
private class AddSubRecAsyncTask extends AsyncTask<JSONArray, Void, String> {
final String mId;
public AddSubRecAsyncTask(String id) {
mId = id;
}
...
私有类AddSubRecAsyncTask扩展了AsyncTask{
最后串中;
公共AddSubRecAsyncTask(字符串id){
mId=id;
}
...
然后您可以在doInBackground
方法中自由使用mId
新建AddSubRecAsyncTask(父项ID)。执行(详细信息)
另一种常见的方法是在需要的位置将
AsyncTask
创建为匿名对象,而不是命名类。然后它可以访问contain类的所有成员变量和containing方法中的final字段。这种方法重用的机会较小,但在某些情况下很有用。AsyncTasks
是对象,因此您可以随时使用构造函数偷偷地输入一些额外的数据
private class AddSubRecAsyncTask extends AsyncTask<JSONArray, Void, String> {
final String mId;
public AddSubRecAsyncTask(String id) {
mId = id;
}
...
私有类AddSubRecAsyncTask扩展了AsyncTask{
最后串中;
公共AddSubRecAsyncTask(字符串id){
mId=id;
}
...
然后您可以在doInBackground
方法中自由使用mId
新建AddSubRecAsyncTask(父项ID)。执行(详细信息)
另一种常见的方法是在需要的位置将您的
AsyncTask
创建为匿名对象,而不是命名类。然后它可以访问包含类的所有成员变量和包含方法中的最终字段。这种方法的重用机会较低,但在某些情况下很有用。感谢您的快速回复。我将尝试您的上述代码。project成功运行,直到保存到db。我在保存到数据库时遇到以下错误。我将其保存到For循环中。原因:java.lang.IllegalStateException:无法执行此操作,因为连接池已关闭。这是另一个问题。是否在循环中关闭数据库?如果所以,不要这样做。我没有在循环中关闭数据库。我正在使用SQLiteOpenHelper,我正在调用它…它在每次写入后都会关闭。这可能会导致问题。在完全使用数据库之前不要调用它。实际上,这只会在放入异步之后才导致。我尝试将记录保存在loo的主面板中p、 我根本没有收到此错误。感谢您的快速回复。我将尝试您的上述代码。项目成功运行,直到保存到db。我在保存到数据库时遇到以下错误。我将其保存到for循环中。原因:java.lang.IllegalStateException:无法执行此操作,因为连接池已关闭。这是一个错误te问题。是否在循环中关闭数据库?如果是,请不要关闭。我没有在循环中关闭数据库。我正在使用SQLiteOpenHelper,并且我正在调用它…它在每次写入后都会关闭。这可能会导致问题。在完全使用数据库之前不要调用它。实际上,这只是在放入异步之后才会导致。我试图将记录保存在循环的主字段中。我根本没有收到此错误。