Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Asynctask:doInBackground中Asynctask和process的两个值_Java_Android_Android Asynctask - Fatal编程技术网

Java Asynctask:doInBackground中Asynctask和process的两个值

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)

我正在尝试将值存储到我的数据库中,并使用AsyncTask来完成此过程。我从Web服务器中提取数据,并通过向async发送Json数组将其存储到DB,然后提取值并存储它们。我正在为循环设置这个

现在这些记录有时有子记录。识别本地数据库中的子记录。我正在添加另一个名为parentID的字段,因此我试图将parentID与jsonarray一起发送到AsyncTask。我不知道怎么做

以下是我迄今为止所做的:

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,并且我正在调用它…它在每次写入后都会关闭。这可能会导致问题。在完全使用数据库之前不要调用它。实际上,这只是在放入异步之后才会导致。我试图将记录保存在循环的主字段中。我根本没有收到此错误。