Передача аргументов AsyncTask и возrotation результатов

У меня есть приложение, которое делает некоторые длительные вычисления, и я хотел бы показать диалог прогресса, пока это сделано. До сих пор я обнаружил, что могу сделать это с помощью streamов / обработчиков, но не работал, а потом узнал об AsyncTask .

В моем приложении я использую на нем карты с маркерами, и я применил функцию onTap для вызова метода, который я определил. Метод создает диалог с кнопками «Да / Нет», и я хотел бы вызвать AsyncTask если «Да» нажата. Мой вопрос заключается в том, как передать ArrayList в AsyncTask (и работать с ним там) и как вернуть новый ArrayList как результат из AsyncTask ?

Код метода выглядит следующим образом:

 String curloc = current.toString(); String itemdesc = item.mDescription; ArrayList passing = new ArrayList(); passing.add(itemdesc); passing.add(curloc); ArrayList result = new ArrayList(); new calc_stanica().execute(passing,result); String minim = result.get(0); int min = Integer.parseInt(minim); String glons = result.get(1); String glats = result.get(2); double glon = Double.parseDouble(glons); double glat = Double.parseDouble(glats); GeoPoint g = new GeoPoint(glon, glat); String korisni_linii = result.get(3); 

Итак, как вы видите, я бы хотел отправить список массива строк «передача» в AsyncTask и получить список строк массива «result». И class calc_stanica AssycTask выглядит следующим образом:

 public class calc_stanica extends AsyncTask<ArrayList, Void, ArrayList> { ProgressDialog dialog; @Override protected void onPreExecute() { dialog = new ProgressDialog(baraj_mapa.this); dialog.setTitle("Calculating..."); dialog.setMessage("Please wait..."); dialog.setIndeterminate(true); dialog.show(); } protected ArrayList doInBackground(ArrayList... passing) { //Some calculations... return something; //??? } protected void onPostExecute(Void unused) { dialog.dismiss(); } 

Поэтому мой вопрос заключается в том, как получить элементы списка «проходящих» массивов в AsyncTask doInBackground (и использовать их там) и как вернуть список массивов для использования в основном методе (список массивов «результат»)?

    Измените свой метод таким образом:

     String curloc = current.toString(); String itemdesc = item.mDescription; ArrayList passing = new ArrayList(); passing.add(itemdesc); passing.add(curloc); new calc_stanica().execute(passing); //no need to pass in result list 

    И измените реализацию вашей асинхронной задачи

     public class calc_stanica extends AsyncTask, Void, ArrayList> { ProgressDialog dialog; @Override protected void onPreExecute() { dialog = new ProgressDialog(baraj_mapa.this); dialog.setTitle("Calculating..."); dialog.setMessage("Please wait..."); dialog.setIndeterminate(true); dialog.show(); } protected ArrayList doInBackground(ArrayList... passing) { ArrayList result = new ArrayList(); ArrayList passed = passing[0]; //get passed arraylist //Some calculations... return result; //return result } protected void onPostExecute(ArrayList result) { dialog.dismiss(); String minim = result.get(0); int min = Integer.parseInt(minim); String glons = result.get(1); String glats = result.get(2); double glon = Double.parseDouble(glons); double glat = Double.parseDouble(glats); GeoPoint g = new GeoPoint(glon, glat); String korisni_linii = result.get(3); } 

    UPD:

    Если вы хотите получить доступ к контексту запуска задачи, самым простым способом было бы переопределить onPostExecute на месте:

     new calc_stanica() { protected void onPostExecute(ArrayList result) { // here you have access to the context in which execute was called in first place. // You'll have to mark all the local variables final though.. } }.execute(passing); 

    Зачем вам передавать ArrayList? Должно быть возможно просто вызвать execute с параметрами напрямую:

     String curloc = current.toString(); String itemdesc = item.mDescription; new calc_stanica().execute(itemdesc, curloc) 

    Как работают варранги? Сделать ArrayList для передачи переменной является двойной работой.

    Я как-то согласен с leander на этом.

    вызов:

     new calc_stanica().execute(stringList.toArray(new String[stringList.size()])); 

    задача:

     public class calc_stanica extends AsyncTask> { @Override protected ArrayList doInBackground(String... args) { ... } @Override protected void onPostExecute(ArrayList result) { ... //do something with the result list here } } 

    Или вы можете просто сделать список результатов параметром classа и заменить ArrayList логическим (успех / сбой);

     public class calc_stanica extends AsyncTask { private List resultList; @Override protected boolean doInBackground(String... args) { ... } @Override protected void onPostExecute(boolean success) { ... //if successfull, do something with the result list here } } 

    Я не делаю этого так. Мне легче перегрузить конструктор classа asychtask ..

    public class calc_stanica расширяет AsyncTask>

     String String mWhateveryouwantToPass; public calc_stanica( String whateveryouwantToPass) { this.String mWhateveryouwantToPass = String whateveryouwantToPass; } /*Now you can use whateveryouwantToPass in the entire asynchTask ... you could pass in a context to your activity and try that too.*/ ... ... 

    Вы можете получить возвращаемые результаты следующим образом: class AsyncTask

     @Override protected Boolean doInBackground(Void... params) { if (host.isEmpty() || dbName.isEmpty() || user.isEmpty() || pass.isEmpty() || port.isEmpty()) { try { throw new SQLException("Database credentials missing"); } catch (SQLException e) { e.printStackTrace(); } } try { Class.forName("org.postgresql.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } try { this.conn = DriverManager.getConnection(this.host + ':' + this.port + '/' + this.dbName, this.user, this.pass); } catch (SQLException e) { e.printStackTrace(); } return true; } 

    получающий class:

     _store.execute(); boolean result =_store.get(); 

    Надеюсь, это поможет.

    Давайте будем гением компьютера.