MVVMcross UI заморозить при вызове метода Async во время инициализацииAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 MVVMcross UI заморозить при вызове метода Async во время инициализации

Сообщение Anonymous »

У меня проблема с MVVMcross на xamarin.android/ios, когда я пытаюсь загрузить содержимое конечной точки API во время инициализации ViewModel. Я загружаю текущий прогноз погоды для области из API, и я написал его в асинхронном методе, и он вызывается из обратных вызовов жизненного цикла инициализации. До сих пор я пробовал stat () и init (). В обоих случаях мой пользовательский интерфейс загружен значениями из моей просмотра, но затем сразу замерзает. Если я установите точку останова в любом месте асинхрового кода, точка останова улавливает и при игре, она работает, как и ожидалось. Я подозреваю, что где -то какое -то состояние гонки, но я не уверен, как избежать его, и получить данные для загрузки, когда появляется мой ViewModel/View. Вот код, который у меня есть:
// Weatherservice
public async Task GetWeatherStatus (string zip)
{
var client = new HttpClient();
var msg = await client.GetAsync(string.Format(WeatherApiUrlBase, WeatherApiKey, zip));
if (msg.IsSuccessStatusCode)
{
using (var stream = await msg.Content.ReadAsStreamAsync())
{
using (var streamReader = new StreamReader(stream))
{
var str = await streamReader.ReadToEndAsync();
var obj = JsonConvert.DeserializeObject(str);
return obj;
}
}
}
return null;
}

// FirstViewModel
public async override void Start ()
{
base.Start ();
FetchWeatherStatus ();
}

private async void FetchWeatherStatus() {
var weatherData = await _service.GetWeatherStatus ("84043");
FeelsLike = weatherData.current_observation.feelslike_f;
}
< /code>
Этот асинхронный код работает с кнопки. Но если вы вызываете из конструктора, init или начните, он будет заморозить пользовательский интерфейс каждый раз, если у меня нет точки останова где -то там. Если бы кто -то мог бы помочь мне найти то, что я делаю не так, я бы признателен. Спасибо. Я останавливаю отладку от Xamarin Studio и перезапускает приложение, и оно работает отлично.
< /code>
Я также попытался добавить .configureawait (false); всем моим ожидаемым звонкам, и это кажется хуже. Пользовательский интерфейс никогда не инициализируется, и он находится на черном экране, а не только на моем обычном замороженном интерфейсе. Я заменил его простой задачей. Дилай (5000) и вернув пустую Weatherstatus, чтобы увидеть, что произошло, и это не замерзало. Я посмотрю на получение данных по -другому. Я новичок в Xamarin, поэтому я открыт для предложений здесь. Спасибо. Вот фрагмент моей задачи. Delay () кода: < /p>
public async Task GetWeatherStatus (string zip)
{
await Task.Delay (5000);
return new WeatherStatus ();
}


Подробнее здесь: https://stackoverflow.com/questions/221 ... ialization
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»