2012-04-04 53 views
7

Tôi đang phát triển một ứng dụng Android yêu cầu sử dụng AsyncTask để kết nối Mạng. Tôi gọi nó từ sợi chính. Vì vậy, phương thức doInBackground chạy và sau đó quay lại phương thức onPostExecute. Sau khi phương thức onPostExecute được thực thi, tôi muốn trả về một giá trị trở lại hoạt động từ nơi nó được gọi, vì tôi phải thực hiện một số hoạt động trong hoạt động cụ thể đó, yêu cầu giá trị trả về từ phương thức onPostExecute. Làm cách nào để giải quyết vấn đề này? Làm thế nào để tôi trả về một giá trị từ onPostExecute?Có thể sử dụng phương thức OnPostExcecute trong các giá trị AsyncTask RETURN không?

Cảm ơn trước

+0

xem http://stackoverflow.com/questions/5457493/asynctask-return-value và http://stackoverflow.com/questions/5457493/asynctask-return-value – ngesh

+0

[Xem câu trả lời này] (http: // stackoverflow.com/questions/7618614/return-data-from-asynctask-class/7618705#7618705) –

Trả lời

8

AsyncTask, như tên của nó đã nói, đang chạy không đồng bộ với thread UI, phương pháp onPostExecute sẽ được gọi tại một số thời điểm trong tương lai, khi doInBackground kết thúc. Chúng ta không quan tâm khi phương thức onPostExecute sẽ được gọi (thực ra không có cách nào để nói tại thời gian xây dựng dự án), điều duy nhất chúng ta quan tâm là phương thức onPostExecute được đảm bảo được gọi đúng bởi khung bên dưới tại một số điểm trong tương lai. Vì vậy, mục đích của phương thức onPostExecute là để xử lý kết quả trả về từ chuỗi công nhân, đây cũng là lý do tại sao đối số duy nhất của phương thức onPostExecute là kết quả được trả về từ phương thức doInBackground.

Tôi có một số hoạt động trong hoạt động cụ thể đó yêu cầu giá trị được trả về từ phương pháp onPostExecute. Tôi giải quyết điều này như thế nào?

Nguyên nhân, bạn có thể tạo một số biến mẫu (hoặc sử dụng mẫu listerner) trong lớp Hoạt động lưu trữ kết quả khi được trả về và sẵn sàng trong phương thức onPostExecute. Vấn đề là bạn không bao giờ biết khi nào kết quả này đã sẵn sàng bên ngoài phương thức onPostExecute tại thời gian xây dựng dự án, vì nó thực sự được xác định trong thời gian chạy ứng dụng. Trừ khi bạn viết một số cơ chế chờ đợi liên tục bỏ phiếu kết quả, kết quả là hy sinh lợi ích của AsyncTask, ví dụ, API AsyncTask.get() tích hợp giúp AsyncTask chạy đồng bộ với chuỗi giao diện người dùng và trả về kết quả cho Hoạt động.

Cách tốt nhất là thay đổi thiết kế của bạn và di chuyển mã hoạt động yêu cầu kết quả trả về từ AsyncTask vào phương thức onPostExecute. hi vọng điêu nay co ich.

+0

@ManJan, tôi đã trả lời một câu hỏi tương tự gần đây [tại đây] (http://stackoverflow.com/questions/10115243/after-asynctask-execute-do-x-từ-hoạt động/10115881 # 10115881) giải thích thêm chi tiết về cách AsyncTask làm việc với chuỗi giao diện người dùng, hy vọng điều này sẽ giúp ích. – yorkw

5

bạn có thể sử dụng phương thức getter và setter để nhận giá trị trở lại từ AsyncTask

public class MainActivity extends Activity { 
    public String retunnumfromAsyncTask; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.layouttest); 
     new Asyntask(this).execute(); 
    } 

    public class Asyntask extends AsyncTask<Void, Void, String> { 
     private final Context Asyntaskcontext; 

     public Asyntask(Context context){ 
      Asyntaskcontext = context; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      MainActivity mainactivity = (MainActivity) Asyntaskcontext; 
      mainactivity.retunnumfromAsyncTask = result;  
      super.onPostExecute(result); 
     } 
    } 
} 
1

Chỉ cần viết lớp AsyncTask làm lớp bên trong vào hoạt động của bạn, sau đó khai báo bất kỳ giá trị nào bạn muốn trả về là toàn cục. no co giup cho bạn được nhiêu không?

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