2011-02-07 20 views
12

trong đơn đăng ký của tôi, tôi có một lớp cho nội dung giao diện người dùng, tên trong số đó là "SettingActivity".Tại sao AsyncTask chạy trong Đề tài chính của một ứng dụng?

Sau đó, để thực hiện một số công việc trong nền, tôi ràng buộc lớp UI này (SettingActivity) thành một Dịch vụ. Có hai phương thức được xác định trước trong Dịch vụ đó (được định nghĩa trong tệp .aidl), một là startTask(), phương thức kia là stopTask().

Trong phần startTask(), tôi đã thực hiện cuộc gọi đến AsyncTask. Nhưng khi tôi kiểm tra tên của Looper của AsyncTask này. Nó là "chính". Theo ý kiến ​​của tôi, một AsyncTask sẽ bắt đầu một Chủ đề khác ngoài Chủ đề chính.

Vì vậy, không ai biết tại sao điều này xảy ra?

Các mã như sau:

@Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     Log.d(TAG, "onPreExecute "+Looper.myLooper().getThread().getName()); 
    } 

Then I will get main as the output.

+1

Sẽ hữu ích nếu bạn có thể đăng một số mã mẫu. –

Trả lời

23

An AsyncTask has several parts: a doInBackground phương pháp thực hiện, chạy trên một luồng riêng biệt và phương thức onPostExecute chạy trên chuỗi giao diện người dùng. Mục đích của onPostExecute là xuất bản các kết quả (chẳng hạn như cập nhật phân cấp khung nhìn, hoặc thiết lập văn bản trong dạng xem văn bản) mà phải được thực hiện trên luồng giao diện người dùng. Nó cũng có thể đăng cập nhật tiến độ. Để làm được điều này, AsyncTask phải được tạo và phương thức execute được gọi, trên chuỗi giao diện người dùng.

Bạn không được gọi hành động giao diện người dùng từ bên trong doInBackground - làm như vậy sẽ làm hỏng ứng dụng của bạn.

+0

Cảm ơn bạn đã trả lời. Thực sự đã giúp tôi rất nhiều ~ – Mathieu

+0

Ví dụ nếu tôi muốn làm Bánh mì nướng trên một sợi riêng biệt, tôi nên làm gì? – Behzad

+1

@Behzad - Nếu bạn có tham chiếu đến hoạt động, bạn có thể sử dụng 'runOnUiThread' như được mô tả trong [câu trả lời này] (http://stackoverflow.com/a/3134720/535871). –

6

Trong thực tế, tôi đã kiểm tra doc của android, onPreExecute(), onProgressUpdate (Progress ...) và onPostExecute (Result) đều "gọi trên thread UI".

Chỉ có phương thức doInBackground (Params ...) được gọi trên chuỗi nền ".

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