有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在尝试将值存储到我的数据库中,并使用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");
        }
       }
    }

我想发送JsonArray(在我上面的代码“details”中)和字符串值(parent_ID),因为它是最终值

不知道该怎么做


共 (2) 个答案

  1. # 1 楼答案

    AsyncTasks是对象,所以你总是可以用构造函数偷偷带一些额外的数据进来

    private class AddSubRecAsyncTask extends AsyncTask<JSONArray, Void, String> {
        final String mId;
        public AddSubRecAsyncTask(String id) {
           mId = id;
        }
        ...
    

    然后,您可以在doInBackground方法中自由使用mId。比如说

    新建AddSubRecAsyncTask(父项ID)。执行(细节)

    另一种常见的方法是在需要的地方将AsyncTask创建为匿名对象,而不是命名类。然后它可以访问contain类的所有成员变量和containing方法中的final字段。这种方法的重用机会较小,但在某些情况下很有用

  2. # 2 楼答案

    我以前用过一种方法,也许不是最好的

    您可以创建一个类来包含要发送到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){
        ...
        }
    }
    

    然后可以在doInBackground函数中提取所需的参数