wake-up-neo.com

Ladeprogramm für Acr-Benutzerdialoge bis zum Ende der Methode anzeigen xamarin forms (Android)

Ich verwende ShowLoading () Acr UserDialogs (v5.2.2) in meinem Xamarin Forms-Projekt (Android und ios), starte den Loader jedoch nicht vor dem Start und warte auf die Methode und verstecke den Loader mit dem Ende.

Mein Code funktioniert auf ios aber auf Android ist nichts passiert.

beispiel

async Task MyMethod()
{
  UserDialogs.Instance.ShowLoading("Loading",MaskType.Black);
  await ViewModel.LoadData();
  UserDialogs.Instance.HideLoading();
}

//InsideViewModel
public async Task LoadData();
{
await Task.Yield(); //without this code and ios doesnt work
//download data
}

Ich füge für Android UserDialogs.Init (this) auf MainActivity.cs hinzu

Irgendeine Hilfe bitte? Vielen Dank

6
G.Mich

Ich schreibe einen Code, der sehr schnell ist und perfekt mit Acr-Benutzerdialogen zusammenarbeitet.

Ich benutze den Abhängigkeitsdienst und hier ist mein vollständiger Beispielcode.

PCL-Code

    void CallService ()
    {
        Device.BeginInvokeOnMainThread (() => UserDialogs.Instance.ShowLoading ("Loading ...", MaskType.Black));
        Task.Run (async () => {
            await DependencyService.Get<IJsonMethods> ().Load ("SERVICE_URL");
        }).ContinueWith (result => Device.BeginInvokeOnMainThread (() => {

            UserDialogs.Instance.HideLoading ();

            }
        })
        );
    }

Schnittstelle

public interface IJsonMethods
{
    Task Load(string url);
}

Abhängigkeitsdienst

public async Task Load (string url)
    {
        try{
            using (var http = new HttpClient (new NativeMessageHandler ())) {
                var x = await http.GetAsync (new Uri (url));
                string res = await x.Content.ReadAsStringAsync ();
                MainViewModel.JsonList = JsonConvert.DeserializeObject<ArticleClass.RootObject> (res);
            }
        }catch (Exception ex) {
            MainViewModel.JsonList = null;
        }
    }
4
G.Mich

Ich benutze eine elegantere Art:

async Task MyMethod()
{
  using(UserDialogs.Instance.ShowLoading("Loading",MaskType.Black))
  {
    await ViewModel.LoadData();
  }
}

//InsideViewModel
public async Task LoadData();
{
  await Task.Yield(); //without this code and ios doesnt work
  //download data
}
3

Sie sollten die await Task.Yield(); nicht verwenden müssen.

Bitte versuchen Sie dies:

async Task MyMethod()
{
    UserDialogs.Instance.ShowLoading("Loading", MaskType.Black);
    await ViewModel.LoadData();
    UserDialogs.Instance.HideLoading();
}

//InsideViewModel
public async Task LoadData()
{
    await DownloadFileAsync("http://url.to.some/file.mp3", "file.mp3");
}

public async Task DownloadFileAsync(string url, string filename) 
{
    var destination = Path.Combine(
    System.Environment.GetFolderPath(
        System.Environment.SpecialFolder.ApplicationData),
        filename);

    await new WebClient().DownloadFileTaskAsync(new Uri(url), destination);
} 
1
jzeferino

nur für iOS können Sie ~~ Device.BeginInvokeOnMainThread (neue Aktion (FunctionName)); ~~ zum Laden von Daten auf UI-Thread ohne Ausnahme verwenden. Ich habe das gerade ausprobiert und es hat funktioniert. Und um die Dialoge zu verwenden, ändern Sie einfach Device.BeginInvokeOnMainThread ( ~~ UserDialogs.Instance.ShowLoading () ~~ ) und ändern Sie das Innere der Funktion entsprechend

0
Harshdeep Singh

Dies ist ein häufiges Problem. Es kommt auf die Tatsache zurück, dass es oft verwirrt ist, dass asynchrone und wartende Hintergrundaufgaben eine Aufgabe sind, obwohl alles, was sie tun, eine bessere Kontrolle über lange laufende Operationen ermöglicht, die möglicherweise asynchroner Natur sind. Sie müssen Ihre Arbeit noch in einem separaten Thread ablegen, da sie sonst möglicherweise den UI-Thread blockiert, d. H.

async Task MyMethod()
{
  UserDialogs.Instance.ShowLoading("Loading",MaskType.Black);
  await ViewModel.LoadData();
  UserDialogs.Instance.HideLoading();
}

//InsideViewModel
public async Task LoadData();
{
 Task.Run(()=> //download data;);
}

Ich gehe davon aus, dass sich MyMethod in einer Page-Instanz befindet und MyMethod über einen Command- oder Click-Handler auf dem UIThread aufgerufen wird.

0
Daniel Maclean