Tôi đang xây dựng một ứng dụng Android giao tiếp với máy chủ thường xuyên miễn là ứng dụng đang chạy.Thực hành tốt nhất cho khách hàng Android để giao tiếp với máy chủ bằng cách sử dụng chủ đề
Tôi làm điều này bằng cách khởi xướng một kết nối đến máy chủ khi ứng dụng bắt đầu, sau đó tôi có một riêng biệt thread
cho nhận tin nhắn gọi ReceiverThread
, đây thread
đọc tin nhắn từ socket
, phân tích nó, và chuyển nó vào phần thích hợp của ứng dụng.
Điều này thread
chạy trong một vòng lặp, đọc bất cứ điều gì nó đã đọc và sau đó chặn trên lệnh read()
cho đến khi dữ liệu mới đến, do đó, nó dành phần lớn thời gian của nó bị chặn.
Tôi xử lý việc gửi thư qua một chuỗi khác, được gọi là SenderThread
. Những gì tôi đang tự hỏi về là: tôi nên cấu trúc các SenderThread
trong một thời trang tương tự? Có nghĩa là tôi nên duy trì một số hàng đợi cho chuỗi này, để cho nó gửi tất cả các tin nhắn trong hàng đợi và sau đó chặn cho đến khi tin nhắn mới nhập vào hàng đợi, hoặc tôi chỉ nên bắt đầu một chủ đề mới mỗi khi một tin nhắn cần được gửi đi , để cho nó gửi tin nhắn và sau đó "chết"? Tôi đang hướng tới cách tiếp cận đầu tiên, nhưng tôi không biết điều gì thực sự tốt hơn cả về mặt hiệu suất (giữ một luồng bị khóa trong bộ nhớ so với khởi tạo chủ đề mới) và về độ chính xác của mã.
Cũng vì tất cả các hoạt động của tôi cần có khả năng gửi và nhận tin nhắn tôi đang giữ tham chiếu đến cả hai chủ đề trong lớp Application
của mình, đó có phải là phương pháp được chấp nhận hay không?
Một vấn đề tôi gặp phải với điều này là đôi khi nếu tôi đóng ứng dụng và chạy lại, tôi thực sự có hai phiên bản của ReceiveThread, vì vậy tôi nhận được một số thông báo hai lần.
Tôi đoán rằng điều này là do ứng dụng của tôi không thực sự đóng và chuỗi trước vẫn hoạt động (bị chặn trên hoạt động read()
) và khi tôi mở lại ứng dụng, một chuỗi mới đã được khởi tạo, nhưng cả hai đều được kết nối với máy chủ để máy chủ gửi tin nhắn cho cả hai. Bất kỳ lời khuyên nào về cách giải quyết vấn đề này, hoặc về cách hoàn toàn sắp xếp lại nó sao cho nó sẽ đúng?
Tôi cố gắng nhìn lên những câu hỏi này nhưng không tìm thấy một số ví dụ mâu thuẫn cho câu hỏi đầu tiên của tôi, và không có gì là đủ hữu ích và áp dụng cho câu hỏi thứ hai của tôi ...
"đóng cửa" các ứng dụng không thực sự giết chết nó. Nó chỉ tiếp tục chạy và đặc biệt là chủ đề là không có cách nào tự động dừng lại – zapl
@ zapl có Tôi biết điều đó, đây là vấn đề của tôi. Câu hỏi đặt ra là: làm thế nào để ngăn chặn các sợi đáng tin cậy? HOẶC cách thực hiện cùng một ứng dụng tổng thể theo cách tránh được vấn đề này? – Bob
Điều đó thực sự phức tạp. 'Thread # interrupt()' (+ 'Socket # close()') có thể được sử dụng để dừng nó nhưng phần cứng là theo dõi xem Ứng dụng có đang chạy hay không hoạt động ở chế độ nền. Mỗi hoạt động có thể làm điều đó từ 'onStart' trên' onStop' chẳng hạn. – zapl