2013-04-26 17 views
6

Tôi đang thiết một người biết lắng nghe PositionChanged trong một đối tượng Geolocator vớiWindows Phone 8 - Geolocator PositionChanged nghe chết sau một thời gian

var geolocator = new Geolocator(); 
geolocator.PositionChanged += Geolocator_PositionChanged; 

Nó hoạt động tốt trong một thời gian. Nhưng sau một thời gian mà không có sự tương tác của người dùng (+ - 4 giờ) nó dừng nhận được thay đổi vị trí, tôi nghĩ bởi vì WP8 chỉ đơn giản là giết nó. Đây có thể là mong muốn từ ms, nhưng điều này là khủng khiếp cho mô hình ứng dụng của tôi.

Điều tôi đã làm là đặt thêm PeriodicTask và gửi vị trí. Và điều này chạy không có vấn đề gì, nhưng nếu người dùng thay đổi vị trí của mình thì tôi không thể theo dõi được nó.

Câu hỏi đặt ra là: Có cách nào để đánh thức Geolocator này mà không cần sự tương tác của người dùng không? Nó có thể được thông qua PeriodicTask hoặc thậm chí trong PositionChanged.

Tôi đã cố gắng khởi tạo một Trình định vị địa lý mới đã có trong đại biểu PositionChanged, nhưng điều này không hoạt động.

Mọi trợ giúp đều được đánh giá cao. Cảm ơn bạn!

+0

Điều đó cũng xảy ra nếu bạn sử dụng lớp GeoCoordinateWatcher thay vì Geolocator? – anderZubi

+0

@anderZubi Chưa thử điều đó. Có vẻ như với tôi rằng MS muốn không dùng giao diện này nữa, phải không? –

+0

Đó là một phần của API .Net, trong khi lớp Geolocator là một phần của API WinPRT mới. Tôi không biết về những ý định tương lai của Microsoft về cái cũ, nhưng nếu bạn không chia sẻ mã với một ứng dụng Windows Store, bạn có thể sử dụng nó. – anderZubi

Trả lời

2

Dường như có một số loại GC giết chết/vô hiệu hóa cá thể.

cố gắng sử dụng geolocator.addEventListener("statuschanged", onStatusChanged);

và khởi động lại các đối tượng khi tình trạng là Windows.Devices.Geolocation.PositionStatus.disabled hoặc Windows.Devices.Geolocation.PositionStatus.notAvailable.

xem Geolocator.StatusChanged | statuschanged event để biết thêm chi tiết.

Hope tôi đã giúp

+1

Xin cảm ơn câu trả lời, nhưng tôi đã thử, và nó không hoạt động tốt. –

1

Bạn đang xác định một thời gian chờ trong GetGeopositionAsync cuộc gọi của bạn? Theo nhận xét cuối cùng ở dưới cùng của this post, mã này khắc phục sự cố trong đó cuộc gọi GetGeopositionAsync không trở lại. Nó có thể liên quan.

public Task GetCurrentPosition() 
{ 

    return Task.Run(() => 
    { 
     if (_geolocator == null) 
     { 
      _geolocator = new Geolocator { DesiredAccuracy = PositionAccuracy.High }; 
     } 

     Geoposition geoposition = null; 

     ManualResetEvent syncEvent = new ManualResetEvent(initialState: false); 

     IAsyncOperation asyncOp = _geolocator.GetGeopositionAsync(); 

     asyncOp.Completed += (asyncInfo, asyncStatus) => 
     { 
      if (asyncStatus == AsyncStatus.Completed) 
      { 
       geoposition = asyncInfo.GetResults(); 
      } 

      syncEvent.Set(); 

     }; 

     syncEvent.WaitOne(); 

     return geoposition.Coordinate; 

    }); 

} 
1

Có thể Garbage Collector tìm thấy nó không sử dụng và giết chết hoặc ít nhất là vô hiệu hóa để tiết kiệm điện.

Hầu hết các tài nguyên phần cứng bạn đang sử dụng có phương pháp gọi là

addEventListener 

Đó là một cách để thông báo rằng tài nguyên: "Hey Tôi muốn nhận thông tin cập nhật từ bạn vì vậy đừng chết". Và đây là mô hình rất phổ biến để quan sát các đối tượng và nhận các bản cập nhật không đồng bộ.

Hãy xem http://en.wikipedia.org/wiki/Observer_pattern

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