Asynctask:doInBackground中AsyncTask和process的两个值

时间:2015-09-26 01:44:27

标签: java android android-asynctask

我正在尝试将值存储到我的数据库中,而我正在使用AsyncTask来执行此过程。我从Web服务器提取数据并通过将Json数组发送到异步然后提取值并存储它们来存储它们。我正在为Loop设置它。

现在这些记录有时会有子记录。识别我的localDB中的子记录。我正在添加另一个名为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

我想发送parent_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(在上面的代码&#34;详细信息&#34;)和String值(parent_ID),因为它是最终值..

不确定如何做到这一点?

2 个答案:

答案 0 :(得分:0)

我之前有过一种方式,也许不是最好的方式。

您可以创建一个类来包含您要发送到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函数中取代你想要的参数。

答案 1 :(得分:0)

AsyncTasks是对象,因此您可以随时使用构造函数隐藏一些额外的数据。

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

然后您可以在mId方法中使用doInBackground。调用类似,

new AddSubRecAsyncTask(parent_ID).execute(details);

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