2015-09-26 2 views
1

Я пытаюсь сохранить значения в моей БД, и я использую AsyncTask для выполнения этого процесса. Я вынимаю данные с веб-сервера и сохраняю их БД, отправив массив Json в async, а затем извлекая значение и сохраняя их. Я настраиваю это на Loop.Asynctask: два значения для AsyncTask и процесс в doInBackground

Теперь у этих записей иногда есть подзаголовки. Определить подзаголовки в моем 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 (в моем коде выше «детали») и строки значение (pARENT_ID), как это конечное значение ..

не знаете, как идти об этом?

ответ

0

AsyncTasks - это объекты, поэтому вы всегда можете подкрасить дополнительные данные с помощью конструктора.

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

Затем вы можете использовать mId в методе doInBackground. Вызвать как:

новый AddSubRecAsyncTask (parent_ID) .execute (подробности);

Другим распространенным подходом является создание вашего AsyncTask в качестве анонимного объекта в том месте, где оно вам нужно, вместо названного класса. Затем он имеет доступ ко всем переменным-членам класса-оболочки и конечным полям в методе -содержании. Меньше шансов для повторного использования с этим подходом, но полезно в некоторых ситуациях.

+0

Спасибо за быстрый ответ. Я попробую ваш код. проект успешно работал до сохранения в db. При сохранении базы данных я получаю следующую ошибку. У меня есть это в цикле For. Вызывается: java.lang.IllegalStateException: не удается выполнить эту операцию, потому что пул соединений был закрыт. –

+0

Это отдельный вопрос. Вы закрываете базу данных в цикле? Если да, то нет. – iagreen

+0

Я не закрываю базу данных в цикле. У меня есть SQLiteOpenHelper, и я называю это ... Он закрывается каждый раз после записи. –

0

Существует способ я использовал раньше, может быть, не самый лучший.

Вы можете создать класс, чтобы включить все informaiton вы хотите отправить в 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.

Смежные вопросы