显示Acr用户对话框加载程序直到方法结束xamarin表单(android)

时间:2016-06-15 10:30:18

标签: c# android xamarin xamarin.android xamarin.forms

我在我的xamarin表单项目(android和ios)上使用ShowLoading()Acr UserDialogs(v5.2.2),但是在启动await方法和隐藏Loader结束之前我不会启动加载器。

我的代码在ios上工作,但在android上没有任何事情发生。

例如

EAAccessoryManager *manager = [EAAccessoryManager sharedAccessoryManager];
NSMutableArray *bluetoothPrinters = [[NSMutableArray alloc] initWithArray:manager.connectedAccessories];

我在MainActivity.cs

上添加了android UserDialogs.Init(this)

请帮忙吗? 感谢

5 个答案:

答案 0 :(得分:4)

我编写了一些代码,其中非常快速,并且与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;
        }
    }

答案 1 :(得分:3)

我使用更优雅的方式:

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 :(得分:1)

您不应该使用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);
} 

答案 3 :(得分:0)

这是一个常见问题。它归结为这样一个事实:它经常混淆async和等待后台一个Task,而实际上他们所做的只是允许更好地控制本质上可能是异步的长时间运行操作。您仍然需要将您的工作项放入单独的线程中,否则它可能会阻止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实例中,并且通过Command或Click处理程序在UIThread上调用MyMethod。

答案 4 :(得分:0)

仅适用于ios,您可以使用 ~~ Device.BeginInvokeOnMainThread(new Action(FunctionName)); ~~ 在UI线程上加载数据而不会出现任何异常..我只是试过它而且它工作。要使用对话框,只需像这样更改Device.BeginInvokeOnMainThread( ~~ UserDialogs.Instance.ShowLoading()~~ )并相应更改函数内部