2016-06-15 3 views
4

私はxamarinフォームプロジェクト(androidとios)でShowLoading()Acr UserDialogs(v5.2.2)を使用しますが、最後のローダー。Show Acr User Dialogsローダーメソッドの終了までxamarinフォーム(アンドロイド)

私のコードはiosで動作しますが、アンドロイドでは何も起こりませんでした。

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

に(この)アンドロイドUserDialogs.Initのための任意の助けをしてください追加しますか? ありがとう

+0

ハズレの内側に変更します。あなたの答えは私の質問の問題ではありません。 –

+0

この質問の正解に私の投稿を記入してください。そのStackOverflowのgooの練習。本当に感謝しています – jzeferino

答えて

2

0

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); 
} 
0

これは共通の問題です。実際に非同期であり、バックグラウンドでタスクを待っていることがよくありますが、実際にはそれらがすべて非同期である可能性のある長時間実行される操作をより良く制御できる場合があります。あなたはまだ、私はMyMethodは、ページのインスタンス内にあり、MyMethodははコマンド経由UIThreadに呼び出されているか、ハンドラをクリックしますと仮定し、それ以外の場合は

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

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

すなわち、UIスレッドをブロックする可能性があります別のスレッドに仕事のあなたの項目を配置する必要があります。私は本当に速いとACRユーザダイアログとの完璧な作業しているいくつかのコードを書く

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 
} 
2

私はもっとエレガントな方法を使用します。

デプレッションサービスを使用しています。私の完全なサンプルコードです。ちょうどiOS用

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; 
     } 
    } 
0

、ヨーヨー私はちょうどそれを試み、それが働いた。~~ Device.BeginInvokeOnMainThread(新しいアクション(FunctionName)); ~~ UIスレッド上のデータをロードするために使用することができます。そして、ダイアログを使用するために、ちょうどこのように(~~ UserDialogs.Instance.ShowLoading()~~)Device.BeginInvokeOnMainThreadを変更し、それに応じて機能

関連する問題