2010-04-06 33 views
5

Sử dụng ứng dụng Android của tôi, khi người dùng thực hiện một hành động nào đó, dịch vụ nền được bắt đầu tìm nạp vị trí GPS hiện tại và lưu nó vào cơ sở dữ liệu ngoài việc thực hiện một số nội dung khác. Trong dịch vụ đó, tôi sử dụng requestLocationUpdates() từ lớp LocationManager và đợi cho đến khi onLocationChanged() của số LocationListener của tôi (được triển khai bởi dịch vụ) được kích hoạt. Nhưng cách tốt nhất để chờ onLocationChanged là gì? Tôi có nên thăm dò ý kiến ​​đơn giản trên một biến và chờ cho đến khi nó được thiết lập không? Có lời khuyên nào không?Cách tốt nhất để chờ sửa chữa vị trí GPS là gì?

Lưu ý: Tôi không thể viết đơn giản vào cơ sở dữ liệu trong onLocationChanged() vì một số nội dung khác.

EDIT: Để xóa hoàn cảnh của tôi, tôi có thể trình bày một ví dụ tương tự như trường hợp của tôi: Giả sử người dùng nhấn nút và phương pháp myMethod được kích hoạt sẽ trả về một số đối tượng. Sau đó, trong myMethod này, tôi sẽ đăng ký cập nhật vị trí từ GPS (sử dụng requestLocationChanged) và ngoài ra hãy đợi vị trí của người dùng và sử dụng nó cho một cái gì đó. Nói cách khác, myMethod không thể trở lại trước khi vị trí có mặt. Tôi không biết làm thế nào tôi có thể sử dụng onLocationChanged trong trường hợp này.

Trả lời

3

Khi vị trí được đặt, thì onLocationChanged được kích hoạt để bạn không cần phải thăm dò ý kiến ​​bất kỳ biến nào. Tại sao bạn không thể lưu vị trí trong onLocationChanged?

+1

Có lẽ vì người nghe gps ở trong dịch vụ nền chứ không phải là quy trình chính của anh ấy. – Segfault

+0

Khi người dùng thực hiện hành động kích hoạt dịch vụ tìm nạp vị trí, ứng dụng của tôi sẽ nhận được vị trí hiện tại trước khi nó tiến hành. Giả sử người dùng nhấn một nút và phương thức myMethod được kích hoạt sẽ trả về một số đối tượng.Sau đó, trong myMethod này tôi sẽ đăng ký cập nhật vị trí từ GPS (bằng cách sử dụng requestLocationChanged) và ngoài ra chờ cho vị trí người dùng và sử dụng nó cho một cái gì đó. Nói cách khác, myMethod không thể trở lại trước khi vị trí có mặt. Tôi không biết làm thế nào tôi có thể sử dụng onLocationChanged trong trường hợp này. – qtips

+1

Vì vậy, bạn muốn tạm dừng thực hiện trong myMethod trong khi chờ đợi cho gps để đồng bộ và cung cấp cho bạn một vị trí? Bạn không nên làm điều đó. Nếu đó là những gì bạn cần làm, bạn nên hiển thị một hộp thoại tiến trình sẽ bị loại bỏ khi onLocationChanged được kích hoạt. Và sau đó cũng trong onLocationChanged kết thúc bất cứ điều gì myMethod cần phải làm gì với vị trí. –

0

Những gì tôi làm là đặt chế độ xem trên màn hình chính thành thanh tiến độ có độ dài không xác định, đặt requestLocationUpdates() và chỉ trả lại cho người dùng. Nếu bạn cần chặn người dùng cho đến khi vị trí được giải quyết, thì bạn có thể mở một hộp thoại ở đầu hoạt động của mình mà không có điều khiển và chế độ xem thanh tiến trình. Sau đó, trong cuộc gọi lại onLocationChanged của bạn, bạn có thể bỏ qua hộp thoại đó và tiếp tục với doanh nghiệp của bạn.

EDIT: Tôi đã đọc lại câu hỏi của bạn và tôi nghĩ tôi hiểu rõ hơn. Đề xuất đầu tiên của tôi là xem liệu bạn có thể thực hiện dịch vụ nền của mình không. Bạn không phải lo lắng về việc ứng dụng không phản hồi trong khi chờ khóa GPS vì API GPS không đồng bộ. Nếu bạn không thể vì bất kỳ lý do gì, thì bạn sẽ phải xem API truyền tin nhắn để cho phép dịch vụ nền của bạn gửi tin nhắn đến Hoạt động chính của bạn khi có dữ liệu GPS. See the Developers guide.

0

Tôi nghĩ bạn nên sử dụng các phương thức chờ/thông báo. Bạn nên có một số đối tượng khóa. Bạn gọi lockObject.wait() trong phương thức của bạn. Và bạn gọi lockObject.notify() trong onLocationChanged. Bằng cách này, phương pháp của bạn sẽ không trở lại cho đến khi onLocationChanged được nhận.

Thực ra giải pháp tốt hơn là xem xét thiết kế của bạn và làm cho phương pháp của bạn không đồng bộ nếu có thể.

0

Tùy thuộc vào sự hiểu biết của tôi về câu hỏi và đọc nhận xét, tôi khuyên bạn nên sử dụng vị trí ban đầu bằng cách sử dụng getLastKnownLocation() trong số LocationManager lớp học. Đồng thời đăng ký sự kiện onLocationChanged. Bây giờ bạn có thể làm bất cứ điều gì bạn muốn trong chức năng xử lý sự kiện này trong khi thực hiện trong giao diện người dùng. Ngoài ra, nếu bạn cần vị trí hiện tại, bạn có thể muốn đợi requestLocationUpdates() để trả lời. Nó có lẽ không phải là một ý tưởng tốt để làm cho người dùng chờ đợi trong khi ứng dụng của bạn chuẩn bị cho một số nhiệm vụ. Theo đề xuất của người khác, bạn có thể sử dụng thanh tiến trình tại đây.

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