web-dev-qa-db-ja.com

メソッドxamarinフォームが終了するまでAcrユーザーダイアログローダーを表示する(Android)

Xamarinフォームプロジェクト(Androidおよびios)でShowLoading()Acr UserDialogs(v5.2.2)を使用していますが、待機メソッドを開始する前にローダーを起動せず、最後にローダーを非表示にします。

私のコードはiOSで動作していますが、Android何も起こりませんでした。

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
}

MainActivity.csにAndroid UserDialogs.Init(this)を追加します

何か助けてください?ありがとう

6
G.Mich

私は、Acrユーザーダイアログで本当に高速で完璧に機能するコードをいくつか書いています。

私は依存関係サービスを使用しています。これが私の完全なサンプルコードです。

PCLコード

    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 ();

            }
        })
        );
    }

インターフェース

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

依存関係サービス

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;
        }
    }
5
G.Mich

私はよりエレガントな方法を使用します:

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

await Task.Yield();を使用する必要はありません。

これを試してください:

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

iOSの場合は、~~ Device.BeginInvokeOnMainThread(new Action(FunctionName)); ~~を使用して、例外を発生させずにUIスレッドにデータをロードできます。ダイアログを使用するには、Device.BeginInvokeOnMainThread(~~ UserDialogs.Instance.ShowLoading()~~)をこのように変更し、それに応じて関数内を変更します。

0
Harshdeep Singh

これは一般的な問題です。実際には、非同期である可能性のある長時間実行操作をより適切に制御できるようにするだけで、タスクのバックグラウンドで非同期と待機を行うことはしばしば混乱するという事実に帰着します。それでも、作業項目を別のスレッドに配置する必要があります。そうしないと、UIスレッドがブロックされる可能性があります。

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

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

MyMethodはPageインスタンス内にあり、MyMethodはコマンドまたはクリックハンドラーを介してUIThreadで呼び出されていると想定しています。

0
Daniel Maclean