2015-11-20 13 views
6

Tôi đang xây dựng một ứng dụng cho cả iOS và Android sử dụng nền tảng chéo Xamarin. Tôi có một dự án có tên là "Core", sau đó là một dự án cho iOS và một cho Android.Làm thế nào để ngủ thread trong Xamarin android và ios?

Trong dự án "Lõi" được chia sẻ, tôi muốn hiển thị hoạt ảnh tải mà tôi đã tạo, trong khi tìm nạp vị trí hiện tại từ thiết bị. Tôi có thể nhận được locationWatcher của tôi, bắt đầu nó, và gọi LocationWatcher.CurrentPosition trực tiếp, nhưng kể từ khi nó vừa mới bắt đầu xem để cập nhật vị trí, nó chưa có thời gian để có được bất kỳ vị trí nào.

Giải pháp của tôi cho điều này là chờ 2 giây sau khi bắt đầu và sau đó nhận vị trí. Tuy nhiên tôi không muốn chờ đợi một cách vô tình, tôi muốn giao diện người dùng bị khóa trong khi chờ đợi. Điều này là do người dùng không thể làm bất cứ điều gì cho đến khi vị trí hiện tại os được biết đến.

Tôi hiện đạt được điều này bằng cách có một vòng lặp:

DateTime startTime = DateTime.Now(); 
while ((DateTime.Now() - startTime).TotalMilliseconds() < 2000) { 
    //Locking the UI here, but it's what I want so it's ok. 
} 

Điều này có vẻ giống như một xấu xí 'Hack' kiếm cái gì đó trong Java sẽ chỉ đơn giản là "Thread.sleep (2000)"

Có một cách tốt hơn để làm điều này?

+0

Cả hai câu trả lời đều hoạt động, nhưng như đã đăng, nó thực sự là ** xấu ** e để chặn luồng giao diện người dùng chính của bạn, hãy nhớ chặn giao diện người dùng dư thừa có thể khiến ứng dụng chấm dứt ứng dụng và thậm chí khiến ứng dụng đó không gửi được ứng dụng. IMO, Đặt một thumper trên màn hình và thực hiện một cuộc gọi async ... – SushiHangover

+0

Ý kiến ​​tuyệt vời, tôi sẽ cố gắng không chặn các chủ đề giao diện người dùng chính như tôi đã được chủ yếu là làm nó bởi vì tôi không thể tải các hoạt hình để hoạt động đúng, vì vậy người dùng đã nhấp chuột một cách dữ dội trong khi họ thực sự phải chờ kết quả. Tôi sẽ cố gắng làm cho công việc đó với "chờ đợi Task.Delay (ms)". – JavaDevSweden

Trả lời

4

Cách đa nền với hình thức Xamarin sẽ được

await Task.Delay(ms); 

Edit:

Sau khi đọc mà bạn thực sự muốn chặn các mainthread heres cách đa nền tảng để chặn một Chủ đề:

Task.Delay(ms).Wait() 
1

Chặn chuỗi giao diện người dùng là hành vi không tốt vì trong số những thứ khác, thiết bị có thể khiến thiết bị đánh dấu ứng dụng là "không phản hồi". Bạn cũng không được đảm bảo rằng vị trí sẽ được xác định sau hai giây, vì vậy trong trường hợp tốt nhất, đề xuất của bạn chỉ là một phần sửa chữa. Điều bạn thực sự muốn làm là chặn đầu vào giao diện người dùng bằng cách vô hiệu khả năng cung cấp đầu vào (có các phương pháp để tắt các phần tử giao diện người dùng của bạn) và sau đó xem có một cuộc gọi lại từ dịch vụ định vị địa lý hay không. vị trí của bạn. Trong phần gọi lại, bật lại các phần tử giao diện người dùng. Nếu một cuộc gọi lại không tồn tại, hãy thực hiện tra cứu vị trí đồng bộ trên luồng giao diện người dùng với RunOnUIThread/InvokeOnMainThread, để luồng chỉ bị chặn cho đến khi nó trả về.

Nếu bạn muốn tiếp tục với giải pháp của bạn dù sao,

RunOnUiThread(() => Thread.Sleep(2000)); 

nên làm các trick, nhưng tôi thực sự khuyên không nên làm điều đó. Trên iOS, bạn sẽ phải làm

InvokeOnMainThread(() => Thread.Sleep(2000)); 
Các vấn đề liên quan