2014-11-16 3 views
0

У меня возникли проблемы при попытке передать String и объект классу AsyncTask. Так что, когда моя кнопка на мыши, она должна пройти в строку и объект EventReview в класс AsyncTask:Передача нескольких значений классу AsyncTask

viewDtlEventBtn.setOnClickListener(new OnClickListener(){ 
     public void onClick(View v){ 
      new GetEventDetailAsyncTask(new GetEventDetailAsyncTask.OnRoutineFinished() { 
       public void onFinish() { 
        //Get the values returned from AsyncTask and pass it to another activity 
       } 
      }).execute(String.valueOf(eventIDTV.getText())); 
     } 
    }); 

А внутри моего класса AsyncTask, я получаю строку в качестве параметра:

public static class GetEventDetailAsyncTask extends AsyncTask<String, Integer, Double> { 
    EventController eventCtrl = new EventController(); 
    Context context; 

    public interface OnRoutineFinished { // interface 
     void onFinish(); 
    } 

    private OnRoutineFinished mCallbacks; 

    public GetEventDetailAsyncTask(OnRoutineFinished callback) { 
     mCallbacks = callback; 
    } 

    public GetEventDetailAsyncTask() { 
    } // empty constructor to maintain compatibility 

    public GetEventDetailAsyncTask(Context context){ 
     this.context = context; 
    } 

    @Override 
    protected Double doInBackground(String... params) { 
     try { 
      eventCommentModel = eventCtrl.getEventCommentByID(params[0]); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    protected void onPostExecute(Double result) { 
     if (mCallbacks != null) 
      mCallbacks.onFinish(); // call interface on finish 

    } 

    protected void onProgressUpdate(Integer... progress) { 
    } 
} 

Поэтому я задаюсь вопросом, есть ли способ передать объект String и EventReview в execute(), а затем, когда doInBackground(), каждый из них выполняет каждый метод. Любые гиды?

Заранее благодарен.

ответ

1

Создать пользовательский конструктор и сохранить переданные переменные в AsyncTask:

public static class GetEventDetailAsyncTask extends AsyncTask<String, Integer, Double> { 
    EventReview eventReview; 
    private OnRoutineFinished mCallbacks; 
    String string; 
    Context context; 

    public GetEventDetailAsyncTask(OnRoutineFinished callback, String str, EventReview review) { 
     mCallbacks = callback; 
     string = str; 
     eventReview = review; 
    } 

    ... 
} 

А затем вызовите AsyncTask, передавая свои ВАР:

public void onClick(View v){ 
    new GetEventDetailAsyncTask(
      new GetEventDetailAsyncTask.OnRoutineFinished() { 
       public void onFinish() { 
        // Get the values returned from AsyncTask and pass it to another activity 
       } 
      }, 
      String.valueOf(eventIDTV.getText(), 
      eventReview).execute()); 
} 
+0

Итак, используя это, когда я вызываю AsyncTask, мне все еще нужно вызвать onFinish()? Потому что я должен передать значения, возвращенные к другому действию. –

+0

@IWasSoLost ваш вопрос непонятен. Вы ничего не сказали о возврате любого из этих значений. – Simas

+0

Извини, что я плохой. Я уже обновил этот вопрос. Но с вашим конструктором, как мне заставить строку и объект выполнять другую задачу в doInBackground()? –

1

Вы можете изменить класс принять Object S, как вход:

public static class GetEventDetailAsyncTask extends AsyncTask<Object, Integer, Double> 

и проверьте, является ли объект экземпляром String или EventReview

@Override 
    protected Double doInBackground(Object... params) { 
     if(params[0] instanceof String) // it is String 
     else if(params[0] instanceof EventReview) // it is EventReview 
    } 
+0

Изменить класс для принятия объекта? Но где объект? –

+0

Исправлен ответ –

+0

@Mohamed_AdbAllah Если я изменил это, я получаю сообщение об ошибке, поскольку метод getEventCommentByID (String) в типе EventController не применим для аргументов (Object). –

2

Вы можете передать строку и свой пользовательский класс объект в Object[] в AsyncTask.

Object[] obj = new Object[2]; 
obj[0] = "my data"; 
obj[1] = myEventReviewObj; 
new GetEventDetailAsyncTask().execute(obj); 

AsyncTask:

public static class GetEventDetailAsyncTask extends AsyncTask<Object, Integer, Double> { 


    @Override 
    protected Double doInBackground(Object... params) { 
    String paramStr = ""; 
    EventReview eventReview = null; 
     if(params[0] instanceof String && params[1] instanceof EventReview) { 
      paramStr = (String) params[0]; 
      eventReview = (EventReview) params[1]; 
     } 
     else { 
      eventReview = params[0]; 
      paramStr = params[1]; 
     } 

     try { 
      //perform operation using String and Object as per your need 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 

Надеется, что это помогает.

+0

Большое спасибо!Ваше решение работает, и это очень ясно для меня :) –

+0

Рад, что я мог помочь :) счастливое кодирование –

+0

принять ответ, если сделано :) @IWasSoLost –

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