Как проверить длительность загрузки данных в Xamarin.forms C# - PullRequest
0 голосов
/ 26 апреля 2020

Я работаю над задачей, в которой мы отображаем ActivityIndicator на телефоне пользователя при загрузке данных. Теперь текущий ActivityIndicator отображает метку «Загрузка ...» при фоновой загрузке в процессе. Но мне нужно обновить ярлык с «Загрузка ...» на что-то вроде «Загрузка еще ...», если загрузка занимает более 20 секунд.

Я пытаюсь выяснить, как использовать функцию таймера из C#, чтобы проверить, выполнялась ли моя загрузка за последние 20 секунд. Насколько я понимаю, OnTimedEvent () срабатывает только по истечении установленного времени, но мне нужно выполнять процесс загрузки параллельно. Вот что я пытаюсь сделать sh.

SetTimer(20000, "Still Downloading...")
// Here while the below api call is running, if it takes more than 20 seconds to complete then fire up the event to update the loading label. 
var response = obj.GetFileData(JsonConvert.SerializeObject(inputJson)); 

Ниже представлена ​​функция моего таймера, которую я прочитал здесь

public static void SetTimer(int timerTime, string eventMessage)
{
    if (timerTime > 0)
    { 
        _timer = new Timer(timerTime);
        _timer.Elapsed += (sender, e) => { OnTimedEvent(eventMessage); };
        _timer.AutoReset = false;
        _timer.Enabled = true;
    }
}

public static void OnTimedEvent(string eventMessage)
{
    mylabel.text = eventMessage;
}

Я не уверен, что мой подход к использованию класса таймера здесь правильный или не. Я сталкивался с несколькими сообщениями о классе таймера, но все они говорят о срабатывании события, когда таймер истек, но не говорят о запуске таймера параллельно моему вызову API.

Любая помощь будет оценена.

1 Ответ

1 голос
/ 27 апреля 2020

Вы имеете в виду, что текст метки не обновляется с "загрузка ..." Обновляется до "все еще загружается ..."?

Я думаю, что при запуске OnTimedEvent , это может не произойти в MainThread (UIThread), поэтому mylabel.text = eventMessage; не будет работать должным образом.

Попробуйте запустить в основном потоке, например:

public  void OnTimedEvent(string eventMessage)
    {
        Device.BeginInvokeOnMainThread(() => { mylabel.Text = eventMessage; });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...