2013-02-12 29 views
60

Tôi rất mới để lập trình và tôi có một số nghi ngờ.Đợi đến khi tác vụ không đồng bộ hoàn thành công việc

Tôi có số AsyncTask mà tôi gọi là RunInBackGround.

và tôi bắt đầu quá trình này như:

new RunInBackGround().execute(); 

Nhưng tôi muốn đợi cho đến khi gọi đây là kết thúc thực hiện của nó, trước khi tiến hành những điều khoản khác của mã.

Tôi có thể làm như thế nào?

Có cách nào cho nó không?

+0

Điểm của AsyncTask là nó không đồng bộ, có nghĩa là nó không được đồng bộ hóa với phần còn lại của mã. – Gjordis

+2

Bạn có thể sử dụng phương thức onPostExecute() của AsyncTask để gọi lại trong lớp của bạn. – DcodeChef

+4

bạn không thực sự muốn đợi cho đến khi nó kết thúc. Những gì bạn muốn là để biết khi nào nó kết thúc. – njzk2

Trả lời

97

chờ đợi cho đến khi gọi đây là kết thúc của nó thực hiện

Bạn sẽ cần phải gọi AsyncTask.get() phương pháp để có được kết quả trở lại và làm cho chờ đợi cho đến khi doInBackground thực hiện không đầy đủ. nhưng điều này sẽ đóng băng chuỗi giao diện người dùng chính nếu bạn không gọi phương thức nhận được bên trong một Chủ đề.

Để có được kết quả trở lại trong UI Chủ đề bắt đầu AsyncTask như:

String str_result= new RunInBackGround().execute().get(); 
+1

để biết cách chờ kết quả không nhận được chủ đề giao diện người dùng chính bị khóa?! nói mã chờ kết quả nhưng trong thời gian trung bình, thanh tiến trình tiếp tục lăn! –

+2

@MuhammadNaderi: Sử dụng 'AsyncTask' mà không có phương thức 'get' và trong phương thức AsyncTask' onPostExecute' được gọi là cung cấp kết quả u trên Giao diện Người dùng Chính –

+1

, đây là một giải pháp mà tôi đã sử dụng trong một thời gian, nhưng đôi khi tôi cần mã để chờ cho asynctask, một cái gì đó như 'await' trong' C# ', và không nhận được thread chính khóa học của khóa học –

29

Mặc dù tối ưu nó sẽ được tốt đẹp nếu mã của bạn có thể chạy song song, nó có thể là trường hợp bạn chỉ cần sử dụng một sợi để bạn không chặn luồng giao diện người dùng, ngay cả khi luồng sử dụng của ứng dụng của bạn sẽ phải đợi.

Bạn có khá nhiều 2 tùy chọn ở đây;

  1. Bạn có thể thực thi mã bạn muốn đợi, trong chính AsyncTask. Nếu nó phải làm với việc cập nhật giao diện người dùng (thread), bạn có thể sử dụng phương thức onPostExecute. Điều này được gọi tự động khi công việc nền của bạn được thực hiện.

  2. Nếu bạn vì một lý do nào đó buộc phải làm điều đó trong Hoạt động/Phân đoạn/Bất cứ điều gì, bạn cũng có thể tự tạo cho mình một người nghe tùy chỉnh mà bạn phát từ AsyncTask của mình. Bằng cách sử dụng này, bạn có thể có một phương thức gọi lại trong Activity/Fragment của bạn/Dù chỉ được gọi khi bạn muốn: aka khi AsyncTask của bạn được thực hiện với bất cứ điều gì bạn phải đợi.

+5

Đây là một câu trả lời tuyệt vời, nên là câu trả lời được chấp nhận. Đây cũng là một ví dụ về cách đạt được điều này với AsyncTasks: http://stackoverflow.com/questions/12575068/how-to-get-the-result-of-onpostexecute-to-main-activity-because-asynctask-is -a –

13

Trong bạn AsyncTask thêm một ProgressDialog như:

private final ProgressDialog dialog = new ProgressDialog(YourActivity.this); 

bạn có thể setMessage trong onPreExecute() phương pháp như:

this.dialog.setMessage("Processing..."); 
this.dialog.show(); 

và trong phương pháp onPostExecute(Void result) bạn bỏ ProgressDialog của bạn.

+0

Cảm ơn thông tin bổ sung này. – AndroidBeginner

11

AsyncTask có bốn phương pháp ..

onPreExecute -- for doing something before calling background task in Async 

doInBackground -- operation/Task to do in Background 

onProgressUpdate -- it is for progress Update 

onPostExecute -- this method calls after asyncTask return from doInBackground. 

bạn có thể gọi công việc của bạn trên onPostExecute() nó gọi sau khi trở về từ doInBackground()

onPostExecute là những gì bạn cần phải thực hiện.

Các vấn đề liên quan