У меня есть приложение, которое выполняет некоторые длительные вычисления, и я хотел бы показать диалог прогресса, когда это будет сделано. До сих пор я обнаружил, что могу сделать это с помощью потоков/обработчиков, но не работал, а затем узнал о AsyncTask
.Передача аргументов AsyncTask и возвращаемые результаты
В моем приложении я использую карты с маркерами на нем, и я применил функцию onTap для вызова метода, который я определил. Метод создает диалог с кнопками Да/Нет, и я бы хотел позвонить AsyncTask
, если нажата кнопка «Да». Мой вопрос заключается в том, как передать ArrayList<String>
в AsyncTask
(и работать с ним там), и как вернуть новый ArrayList<String>
как результат из AsyncTask
?
Код метода выглядит следующим образом:
String curloc = current.toString();
String itemdesc = item.mDescription;
ArrayList<String> passing = new ArrayList<String>();
passing.add(itemdesc);
passing.add(curloc);
ArrayList<String> result = new ArrayList<String>();
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
, и получить «результат» строка массив назад. А класс calc_stanica AssycTask
выглядит следующим образом:
public class calc_stanica extends AsyncTask<ArrayList<String>, Void, ArrayList<String>> {
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<String> doInBackground(ArrayList<String>... passing) {
//Some calculations...
return something; //???
}
protected void onPostExecute(Void unused) {
dialog.dismiss();
}
Так что мой вопрос заключается в том, чтобы получить элементы «ближнего» списка массива в методе AsyncTask doInBackground
(и использовать их там), и как вернуть список массива использовать в основном методе (список массива «результат»)?
Благодарим вас за ответ, но у меня есть еще одна вещь, чтобы спросить. Если я определяю int min = Integer.parseInt (minim); например, в классе AsyncTask onPostExecute(), как я могу получить к нему доступ из моего метода основного класса? Когда я меняю его так, я получаю ошибку «мин не может быть разрешен» в методе основного класса. –
@Bojan Ilievski: Просто сделайте свою переменную min глобальной. – Wroclai
Спасибо за ваши ответы еще раз, я решил свои проблемы ... –