Tôi có một ứng dụng thực hiện một số phép tính dài và tôi muốn hiển thị hộp thoại tiến trình trong khi thực hiện xong. Cho đến nay tôi đã tìm thấy rằng tôi có thể làm điều này với các chủ đề/xử lý, nhưng không làm việc, và sau đó tôi phát hiện ra về AsyncTask
.Truyền đối số cho AsyncTask và trả về kết quả
Trong ứng dụng của tôi, tôi sử dụng bản đồ có các điểm đánh dấu trên đó và tôi đã triển khai hàm onTap để gọi một phương thức mà tôi đã xác định. Phương thức này tạo một hộp thoại có các nút Có/Không và tôi muốn gọi số AsyncTask
nếu Có được nhấp. Câu hỏi của tôi là làm thế nào để vượt qua một ArrayList<String>
đến AsyncTask
(và làm việc với nó ở đó), và làm thế nào để lấy lại một mới ArrayList<String>
như một kết quả từ AsyncTask
?
Mã của phương pháp này trông như thế này:
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);
Vì vậy, như bạn thấy đấy, tôi xin gửi đến chuỗi array list "đi" vào AsyncTask
, và để có được những "kết quả" chuỗi mảng danh sách trở lại từ nó. Và lớp calc_stanica AssycTask
trông như thế này:
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();
}
Vì vậy, câu hỏi của tôi là làm thế nào để có được các yếu tố của "đi qua" danh sách mảng trong phương pháp AsyncTask doInBackground
(và sử dụng chúng ở đó), và làm thế nào để trả lại một danh sách mảng sử dụng trong phương thức chính (danh sách mảng "kết quả")?
Cảm ơn câu trả lời của bạn, nhưng tôi còn một điều nữa để hỏi. Nếu tôi định nghĩa int min = Integer.parseInt (minim); ví dụ, trong lớp AsyncTask onPostExecute(), làm thế nào tôi có thể truy cập nó từ phương thức lớp chính của tôi? Khi tôi thay đổi nó như thế này, tôi nhận được lỗi "min không thể được giải quyết" trong phương pháp lớp học chính. –
@Bojan Ilievski: Chỉ cần biến min của bạn thành toàn cầu. – Wroclai
Cảm ơn cả hai câu trả lời của bạn một lần nữa, tôi đã giải quyết được vấn đề của mình ... –