У меня есть приложение форм xamarin. В моем приложении у меня есть нажатие кнопки, которое вызовет определенный веб-API и покажет всплывающие окна (плагин Rg.popUp) в соответствии с моей логикой. Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь реализовать индикатор активности Acr.Userdialog, когда пользователь нажимает кнопку. Каково мое намерение: когда пользователь нажимает кнопку, должен отображаться индикатор, а вызовы API должны выполняться в фоновом режиме, пока не появятся всплывающие окна.
Что я сделал
namespace sampleapp
{
public partial class MainPage : ContentPage
{
string truequescount;
MobileListData mobileListData = new MobileListData();
StateListData stateListData = new StateListData();
UserMappedStateListData userMappedStateListData = new UserMappedStateListData();
public MainPage()
{
InitializeComponent();
LoadScreenItems();
}
private async void submit_clicked(object sender, EventArgs args)
{
if (StateListData.Entry[0].State.Contains(State_picker.Text))
{
UserDialogs.Instance.ShowLoading("submitting data...");
try
{
//My API Calls
if (transactions[0].Questions.Count < 5)
{
// navigation 1 according to condition
UserDialogs.Instance.HideLoading();
await PopupNavigation.PushAsync(new NoDataPopUp());
}
else
{
//some logic
if (ObjQuestionData.Count < 1)
{
//navigation 2 according to condition
UserDialogs.Instance.HideLoading();
await PopupNavigation.PushAsync(new InsuffQdata());
}
else
{
//some logic
}
}
// Orginal navigation if all conditions surpassed
UserDialogs.Instance.HideLoading();
await Navigation.PushAsync(new SecurityQuestionScreen(tranzaction, formdata));
}
catch (Exception)
{
}
}
else
{
// another navigation according to condition
UserDialogs.Instance.HideLoading();
await PopupNavigation.PushAsync(new FormVerificationPopup(formdata));
}
}
}
}
В соответствии с моим индикатором загрузки кода отображается только после появления всплывающего окна. Любая помощь приветствуется.
Редактировать
Я попытался загрузить это в основной поток, и это сработало нормально. Но теперь он работает только в андроиде 9.0. Не отображается ни на одном устройстве под андроид 9. В чем может быть причина?
Просто отладьте исходный код и посмотрите, возвращает ли выражение "StateListData.Entry[0].State.Contains(State_picker.Text)" значение true.
@yanng you ... Да, братан, API, и все работает нормально ... Я просто не могу показать этот индикатор ... Если я запущу его в основном потоке, он будет работать?
Можете ли вы поставить await Task.Delay(200) выше, показать загрузку и повторить попытку?
@AditKothari, братан, это сработало, когда я запустил его в основной теме ... Я обновил свой вопрос ... вы можете мне помочь?
как насчет изменения подписи метода с "private async void submit_clicked(...)" на "private async Task submit_clicked(...)". Я получил идею от forums.xamarin.com/discussion/76524/…
Device.BeginInvokeOnMainThread(async () => {
try
{
using (this.Dialogs.Loading("Loading..."))
{
await Task.Delay(300);
//Your Service code
}
}
catch (Exception ex)
{
var val=ex.Message;
UserDialogs.Instance.Alert("Test", val.ToString(), "Ok");
}
});
Бро, это решит проблему не отображения в андроиде 8.0 и ниже?
сработало для меня однажды... вы проверите и дайте мне знать.. помогло вам это или нет.
есть ли разница между UserDialogs.Instance.ShowLoading("отправка данных..."); и используя (this.Dialogs.Loading("Загрузка..."))
Без разницы.. я просто вызываю this.Dialogs.Loading("Loading...") из базового класса.
Можешь попробовать это ожидание Task.Delay(200); UserDialogs.Instance.ShowLoading("отправка данных...");
Хорошо, давай я проверю, братан
Добавление await Task.Delay(200) работает и в моем случае. Не могли бы вы объяснить, как это работает, и рекомендуется ли использовать Task.Delay?
Вы пытались запустить в Main Thread или Thread ?