2012-12-24 30 views
11

Hy vọng ai đó có thể giải thích điều này cho tôi hoặc chỉ cho tôi một tài nguyên tôi có thể đọc để tìm hiểu thêm. Tôi đang xây dựng một ứng dụng mà sử dụng một ListView và một bộ chuyển đổi danh sách tùy chỉnh mà tôi mô hình tắt một trong rất nhiều hướng dẫn có sẵn trực tuyến như thế này:Hiểu khi nào và tại sao sử dụng các chủ đề Android khác nhau

http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/

Nó hoạt động tốt. Tuy nhiên, mỗi ví dụ về cách thực hiện điều này đều chạy quá trình xây dựng danh sách các đối tượng được hiển thị và thu thập dữ liệu cần thiết trên các luồng riêng biệt.

Tôi muốn biết tại sao/Bạn không thể đặt mọi thứ vào onCreate? Tôi không thể thấy một lý do tại sao bạn sẽ cần các chủ đề riêng biệt để thực hiện điều này. Có một số hình thức chung/tiêu chuẩn cho khi nào/những gì tôi phải chạy trên một số chủ đề?

Trả lời

7

The Android docs về điều này rất tốt, giống như hầu hết mọi thứ.

Bản cập nhật là: Giao diện người dùng phải luôn đáp ứng. Vì vậy, if you have some operation that will take enough time that the user will notice, you might want to consider not running it in the UI thread. Một số ví dụ phổ biến là network IOdatabase accesses. Đó là một cái gì đó của từng trường hợp cụ thể, vì vậy bạn phải thực hiện cuộc gọi cho chính mình một chút.

+0

Ok vì vậy ý ​​tưởng là ủy nhiệm các tác vụ có thể mất nhiều thời gian hơn cho các chủ đề khác để chủ đề chính không chờ đợi thông tin từ nơi khác trong khi nó có thể chạy cái gì khác. Vì vậy, trong khi bạn có thể chạy tất cả mọi thứ từ onCreate nó chỉ có lẽ không phải là cách hiệu quả nhất để làm điều đó. – Rarw

+0

Vâng nó phụ thuộc vào cách bạn xác định "hiệu quả". Phương pháp hay nhất cho thấy rằng nếu bạn có thứ gì đó sẽ mất một lượng thời gian "đáng chú ý", thì bạn nên di chuyển nó ra khỏi chuỗi giao diện người dùng, và do đó ra khỏi onCreate. Nó cũng phần nào tùy thuộc vào việc bạn có cần kết quả để hiển thị giao diện người dùng hay không, v.v. Nhưng có, nhận xét của bạn là chính xác nói chung tôi sẽ nói. – mfrankli

2

Vâng, nếu xây dựng danh sách các đối tượng không phải là một quá trình tương đối ngắn, hãy thực hiện nó trong onCreate() sẽ chặn/làm chậm luồng chính. Nếu bạn sử dụng một chuỗi riêng biệt, nó sẽ cho phép hệ điều hành Android tải tất cả các phần tử giao diện người dùng trong khi bạn đang chờ danh sách được điền. Sau đó, khi danh sách các đối tượng đã sẵn sàng, bạn có thể ngay lập tức điền giao diện người dùng đã được khởi tạo, trái ngược với chờ đợi để khởi tạo giao diện người dùng cho đến sau khi danh sách các đối tượng được tạo. Nó đảm bảo rằng ứng dụng của bạn sẽ luôn đáp ứng cho người dùng.

0

Vì bạn chỉ có 0,5 giây để thực thi onCreate - sau đó thông báo lỗi ADN (ứng dụng không phản hồi) được hiển thị. Vì vậy, trừ khi xem danh sách của bạn là siêu đơn giản, bạn sẽ không làm cho nó nó trong thời gian. Và ngay cả khi xem danh sách của bạn là siêu đơn giản thì tốt hơn là tìm hiểu nó theo cách thích hợp.

BTW: Tôi thậm chí không sử dụng chủ đề, tôi sử dụng một hoặc nhiều Dịch vụ để thực hiện tất cả công việc. Thậm chí còn khó thực hiện hơn nhưng mạnh mẽ hơn và đáp ứng tốt hơn.

0

Lý do bạn không thực hiện mọi việc trong onCreate hoặc trên chuỗi giao diện người dùng là để phản hồi. Nếu ứng dụng của bạn mất quá nhiều thời gian để xử lý, người dùng sẽ hiển thị hộp thoại Ứng dụng không phản hồi.

0

giáo viên của tôi đã từng nói: mỗi phần mềm có thể được viết bằng một vòng lặp (lớn) duy nhất.

Và nếu bạn nghĩ: có thể ... có thể ở cấp độ NDK.

Một số nhà phát triển SDK muốn làm cho các nhà phát triển phần mềm hoạt động dễ dàng hơn và đó là lý do tại sao tồn tại SDK và khung công tác.

Trừ khi bạn không cần bất cứ điều gì từ đa nhiệm, bạn nên sử dụng luồng đơn.

Đôi khi có giới hạn thời gian, đôi khi giới hạn UI/nền/mạng và cần phải thực hiện các công cụ trong các chủ đề khác.

0

Nếu bạn thấy mã nguồn của Asyntask và Handler, bạn sẽ thấy mã của chúng hoàn toàn bằng Java. (tất nhiên, có một số ngoại lệ, nhưng đó không phải là một điểm quan trọng).

Tại sao có nghĩa là gì? Nó có nghĩa là không có phép thuật trong Asyntask hoặc Handler. Họ chỉ làm cho công việc của bạn dễ dàng hơn như một nhà phát triển.

Ví dụ: Nếu Programa gọi methodA(), methodA() sẽ chạy trong một thread khác với ProgramA.You có thể dễ dàng kiểm tra bằng cách:

Thread t = Thread.currentThread();
int id = t.getId();

Và tại sao bạn nên sử dụng thread mới? Bạn có thể google cho nó. Nhiều lý do.

Vì vậy, sự khác biệt là gì?

AsyncTask và Handler được viết bằng Java (sử dụng nội bộ một Thread), vì vậy mọi thứ bạn có thể làm với Handler hoặc AsyncTask, bạn cũng có thể đạt được bằng cách sử dụng một Thread.

Trình xử lý và AsyncTask thực sự giúp gì cho bạn?

Lý do rõ ràng nhất là liên lạc giữa chuỗi người gọi và chuỗi công nhân. (Chủ đề người gọi: Một chủ đề gọi là Chủ đề công việc để thực hiện một số nhiệm vụ. Chủ đề người gọi có thể không phải là Chủ đề giao diện người dùng luôn). Và, tất nhiên, bạn có thể giao tiếp giữa hai luồng theo các cách khác, nhưng có nhiều nhược điểm, ví dụ: Chủ đề chính không phải là chủ đề an toàn (trong phần lớn thời gian), nói cách khác, NGUY HIỂM.

Đó là lý do tại sao bạn nên sử dụng Handler và AsyncTask. Họ làm hầu hết các công việc cho bạn, bạn chỉ cần biết những phương pháp để ghi đè lên.

Trình xử lý sự khác biệt và AsyncTask: Sử dụng AsyncTask khi chuỗi người gọi là Chủ đề giao diện người dùng. Đây là những gì tài liệu android nói:

AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers

tôi muốn nhấn mạnh vào hai điểm:

1) Dễ dàng sử dụng các thread UI (như vậy, sử dụng khi gọi thread UI Thread).

2) Không cần thao tác xử lý. (có nghĩa là: Bạn có thể sử dụng Trình xử lý thay vì AsyncTask, nhưng AsyncTask là một tùy chọn dễ dàng hơn).

Có nhiều điều trong bài đăng này mà tôi chưa nói, ví dụ: UI Thread là gì, tại sao nó dễ dàng hơn. Bạn phải biết một số phương pháp sau từng loại và sử dụng nó, bạn sẽ hoàn toàn hiểu tại sao ..

@: khi bạn đọc tài liệu Android, bạn sẽ thấy:

Handler allows you to send and process Message and Runnable objects associated with a thread's MessageQueue

Họ có thể có vẻ lạ lúc đầu .Chỉ cần hiểu rằng, mỗi luồng có mỗi hàng đợi tin nhắn. (như một Danh sách việc cần làm) và chuỗi sẽ nhận từng thư và làm điều đó cho đến khi có hàng đợi tin nhắn. (Ah, có thể như bạn hoàn thành công việc của bạn và đi ngủ). Vì vậy, khi Handler giao tiếp, nó chỉ đưa ra một thông báo cho chủ đề người gọi và nó sẽ đợi để xử lý. (sophiscate? nhưng bạn chỉ biết rằng, Handler có thể giao tiếp với chủ đề người gọi theo cách an toàn)

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