Vấn đề của tôi giống với số này Instance variable of Activity not being set in onPostExecute of AsyncTask or how to return data from AsyncTask to main UI thread nhưng tôi muốn gửi lại dữ liệu cho cùng một hoạt động gọi điện. Không startActivity cho intent luôn khởi động lại hoạt độnglàm cách nào để gửi dữ liệu trở lại từ onPostExecute trong AsyncTask?
Trả lời
Mở tùy chọn là sử dụng các thính giả, nơi bạn tạo ra một giao diện mà implents hoạt động của bạn, một cái gì đó như:
public interface AsyncListener {
public void doStuff(MyObject obj);
}
Bằng cách đó, nếu bạn đang phân lớp AsyncTask, thật dễ dàng để thêm người nghe này, sau đó trong onPostExecute(), bạn có thể làm điều gì đó như:
protected void onPostExecute(MyObject obj) {
asyncListener.doStuff(obj);
}
Điều này phụ thuộc vào cấu trúc lớp của bạn, nhưng nếu AsyncTask của bạn là một lớp trong Activity của bạn thì bạn có thể tham chiếu các phương thức của hoạt động đó. Những gì bạn sẽ làm là trong phương pháp onPostExecute bạn gọi một chức năng của hoạt động của bạn mà đi một số dữ liệu đã được lấy ra trong AsyncTask đến hoạt động nơi sau đó bạn có thể sử dụng nó ..
Mã này sẽ trông như thế này
class YourActivity extends Activity {
private static final int DIALOG_LOADING = 1;
public void onCreate(Bundle savedState) {
setContentView(R.layout.yourlayout);
showDialog(DIALOG_LOADING);
new LongRunningTask1().execute(1,2,3);
}
protected Dialog onCreateDialog(int dialogId) {
switch(dialogId) {
case DIALOG_LOADING:
ProgressDialog pDialog = new ProgressDialog(this);
pDialog.setTitle("Loading Data");
pDialog.setMessage("Loading Data, please wait...");
return pDialog;
default:
return super.onCreateDialog(dialogId);
}
}
private void onBackgroundTaskDataObtained(List<String> results) {
dismissDialog(DIALOG_LOADING);
//do stuff with the results here..
}
private class LongRunningTask extends AsyncTask<Long, Integer, List<String>> {
@Override
protected void onPreExecute() {
//do pre execute stuff
}
@Override
protected List<String> doInBackground(Long... params) {
List<String> myData = new ArrayList<String>();
for (int i = 0; i < params.length; i++) {
try {
Thread.sleep(params[i] * 1000);
myData.add("Some Data" + i);
} catch(InterruptedException ex) {
}
}
return myData;
}
@Override
protected void onPostExecute(List<String> result) {
YourActivity.this.onBackgroundTaskDataObtained(result);
}
}
}
Vì vậy, dòng chảy điển hình là như thế này, đặt chế độ xem của trang hiện tại và sau đó hiển thị hộp thoại tiến trình. Ngay sau đó bắt đầu nhiệm vụ async (hoặc bất cứ khi nào, nó không quan trọng thực sự).
Sau khi tác vụ không đồng bộ của bạn hoàn tất, hãy gọi một chức năng của hoạt động và chuyển dữ liệu đó. Không sử dụng dữ liệu được chia sẻ trong tác vụ không đồng bộ hoặc bạn có nguy cơ gặp vấn đề với luồng. Thay vào đó, khi bạn đã hoàn thành, hãy chuyển nó đến hoạt động. Nếu bạn muốn cập nhật quan điểm dần trong khi làm việc bạn có thể sử dụng trên onProgressUpdate
- 1. Trả lại dữ liệu từ AsyncTask Android
- 2. onPostExecute trên bị hủy AsyncTask
- 3. Làm cách nào để trả lại boolean từ AsyncTask?
- 4. Cách chuyển dữ liệu từ AsyncTask sang Ui Chủ đề
- 5. Trả lại dữ liệu từ AsyncTask mà không chặn UI
- 6. Làm cách nào để trả lại dữ liệu từ QDialog?
- 7. Làm thế nào để gửi JSON trở lại với JAVA?
- 8. Android AsyncTask trả về nhiều giá trị trong doInBackground để sử dụng cho onPostExecute
- 9. NSURLConnection đang trở lại dữ liệu cũ
- 10. Android - Cách gửi dữ liệu trở lại hoạt động gọi điện
- 11. Cách chuyển dữ liệu trở lại cửa sổ chính?
- 12. Android AsyncTask onPostExecute tắt chủ đề ui chính
- 13. Gửi subview trở lại
- 14. CasperJS truyền dữ liệu trở lại PHP
- 15. trở lại dữ liệu khai báo trong hàm
- 16. AsyncTask để cập nhật tiện ích - cách truy cập vào các bản xem trước văn bản trong onPostExecute()?
- 17. Ajax PHP Jquery - ghi lại dữ liệu trở lại
- 18. Làm cách nào để gửi dữ liệu POST bằng LWP?
- 19. Cách tạo lại AsyncTask từ Android trong mã Java thuần túy
- 20. Làm thế nào để bạn liên kết ggplot2 grobs trở lại dữ liệu?
- 21. Gửi dữ liệu mẫu từ Knockout quay lại MVC 3
- 22. Không thể ghi đè phương thức onPostExecute() trong Lớp AsyncTask hoặc làm cho nó kích hoạt
- 23. Tôi có thể gửi lại dữ liệu bằng cách sử dụng kết thúc bằng cách nào?
- 24. Làm cách nào để chuyển dữ liệu từ Javascript sang PHP và ngược lại?
- 25. Beagleboard: Làm cách nào để gửi/nhận dữ liệu đến/từ DSP?
- 26. Cách chuyển dữ liệu từ chế độ xem web trở lại ứng dụng Android gốc
- 27. onPostExecute không được gọi là
- 28. Bắt dữ liệu trở lại từ django views.py và sử dụng ajax để hiển thị nó
- 29. chuyển đổi dữ liệu trở lại vào một chuỗi
- 30. Nút quay lại gửi lại dữ liệu biểu mẫu ($ _POST)
Cảm ơn câu trả lời của bạn. Tôi không phải là fan của AsyncTask đang được sử dụng như một lớp phụ. Tôi nghĩ bạn sẽ có thể sử dụng các sự kiện. Tôi nghĩ rằng câu trả lời là sử dụng ý định nhưng tôi sẽ chỉ tạo ra một trường hợp mới của hoạt động của tôi mà tôi không muốn. – skinnybrit51
Bạn có thể dễ dàng sử dụng AsyncTask trong lớp riêng của mình, nhưng điều đó chỉ hữu ích nếu bạn đang sử dụng cùng một logic đó từ nhiều hoạt động khác nhau. Trong trường hợp này, bạn có thể: 1. sử dụng một lớp cơ sở chung (không hoạt động hoạt động) và sau đó bạn có một phương thức chung có thể được gọi từ tác vụ không đồng bộ. Hoặc tốt hơn nhưng có cả hai thực hiện một giao diện chung mà có gọi lại như tôi mô tả. Chuyển tham chiếu đến hoạt động vào hàm khởi tạo của AsyncTask và đảm bảo asyncTask có một hàm tạo có tham số của kiểu giao diện. –
Tùy chọn cuối cùng của bạn là mương AsyncTask hoàn toàn và đặt nó vào một dịch vụ mà bạn cần tạo một luồng mới để thực hiện hoạt động nền (vì các dịch vụ sẽ không chạy trong chuỗi riêng theo mặc định). Một cách dễ dàng để làm điều này là tạo một IntentService tạo ra một luồng mới cho bạn. –