2013-08-12 3 views
0

[У меня есть пользовательский parcelable объект Vehicle]AsyncTask передавая пользовательские объекты

Я смотрел на AsyncTask, но это не было слишком ясно, по этой теме:

Я хотел бы передать строку (которая Транспортное средство ID автомобиля) в AsyncTask, то в doInBackground() у меня есть метод

mRemoteInterface.getTrackHistory(); 

, который дает мне ArrayList. Я бы хотел, чтобы в onPostExecute() запустили действие, в котором идентификаторы Vehicle ID и ArrayList являются дополнительными.

Это схема того, что я не смогу сделать. Проблема в том, что я не понимаю, как передать объекты INTO в asynctask, а затем из doInBackground() в onPostExecute() и из onPostExecute() обратно в исходный вызов выполнения.

getTrackHistory.execute (ЧТО ДОЛЖНО ЗДЕСЬ?);

private class getTrackHistory extends 
AsyncTask<String, Integer, Boolean **WHAT SHOULD GO HERE?**> { 

    @Override 
    protected Boolean doInBackground(
      String... params) { 
     try { 
      String vehicleID = params[0]; 
      listVehicleHistory = (ArrayList<Vehicle>) mRemoteInterface.getVehicleHistory(vehicleID); 
     } catch (Exception e) { 

      e.printStackTrace(); 
     } 


    } 




    @Override 
    protected void onProgressUpdate(Integer... progress) { 

    } 

    @Override 
    protected void onPostExecute(Boolean worked) { 

     super.onPostExecute(worked); 

     Intent intent = new Intent(MainActivity.this,VehicleInfo.class); 

     intent.putExtra("Vehicle ID", toReturn); 
     intent.putParcelableArrayListExtra("VehicleHistory", listVehicleHistory); 

     startActivity(intent); 
    } 

}

+0

Просто создайте конструктор для задачи async. его намного проще, чем atte, pting передать детали в качестве параметров. – r2DoesInc

+0

можете ли вы объяснить это немного больше? – benzabill

ответ

5

Вы можете передать строку в конструктор AsyncTask или doInbackground

new getTrackHistory(mystringvalue).execute(); 

Затем в конструкторе

private class getTrackHistory extends 

AsyncTask {

String value; 
    public getTrackHistory(String mystring) 
    { 
     value= mystring; 
    } 

Edit:

Вы также можете передать значение doInbackground()

new TheTask().execute("mystring"); 
    class TheTask extends AsyncTask <String,Void,Void> 
    { 
    @Override 
    protected void onPreExecute() { 
    super.onPreExecute(); 
    } 
    @Override 
    protected void onPostExecute(Void result) 
    super.onPostExecute(result); 

     } 
    @Override 
    protected Void doInBackground(String... params) { 
    String value = params[0]; 
    return null; 
    } 
} 

К вопросу в комментарии

new getTrackHistory(mystringvalue,ActivityName.this).execute(); 

В Constructor

String value; 
    TheInterface listener; 
    public getTrackHistory(String mystring,Context context) 
    { 
     value= mystring; 
     listener = (TheInterface) context; 
    } 

интерфейс

public interface TheInterface { 

public void theMethod(ArrayList<String> result); // your result type 

} 

Тогда

В вашем doInbackground возвращает результат. Я предполагаю его ArrayList типа String. Измените arraylist на то, что соответствует вашим требованиям.

В вашем onPostExecute

if (listener != null) 
{ 
    listener.theMethod(result); // result is the ArrayList<String> 
    // result returned in doInbackground 
    // result of doInbackground computation is a parameter to onPostExecute 
} 

В классе деятельности реализуют интерфейс

public class ActivityName implements getTrackHistory.TheInterface 

Тогда

@Override 
public void theMethod(ArrayList<String> result) { // change the type of result according yo your requirement 
// use the arraylist here 
} 

Похожие запись с помощью интерфейса

Android Parse JSON stuck on get task.

+0

Спасибо, это имеет смысл. Не могли бы вы подробнее перейти от onPostExecute() к тому, где была вызвана новая getTrackhistory (mystringvalue) .execute()? (Возможно ли это) – benzabill

+0

@bent вы можете сделать это с помощью интерфейса. я ответил на аналогичный вопрос. я найду ссылку – Raghunandan

+0

Ах, спасибо. Поэтому я могу передать значение либо doInBackground(), либо конструктору. Эффективно то же самое. Спасибо @Raghunandan !!! – benzabill

0

AsyncTask это просто класс, как и любой другой, использовать конструктор, или заполнить экземпляра объекта через сеттер, представителей общественности и т.д.

2

Общий подход к это передать ваши аргументы/объекты в конструкторе ваш AsyncTask, храните в качестве члена, а затем ссылку от doInBackground(). Например:

private class getTrackHistory extends AsyncTask<String, Integer, Boolean> { 

    Vehicle mVehicle; 

    public getTrackHistory(Vehicle v) { 
     mVehicle = v; 
    } 

    @Override 
    protected Boolean doInBackground() { 

      // use mVehicle member here 

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