Xamarin.android Xamarin Android中的进度对话框出错“;只有创建视图层次结构的原始线程才能接触其视图&x201D;

Xamarin.android Xamarin Android中的进度对话框出错“;只有创建视图层次结构的原始线程才能接触其视图&x201D;,xamarin.android,progressdialog,Xamarin.android,Progressdialog,我试图在填充datagrid时使用进度对话框,但我得到以下错误:“只有创建视图层次结构的原始线程才能接触其视图”,这是我的代码,希望他们能帮助我 public async void RelacionClientesREST() { try { var dlg = ProgressDialog.Show(this, "Loading", "Cargando relación de usuarios");

我试图在填充datagrid时使用进度对话框,但我得到以下错误:“只有创建视图层次结构的原始线程才能接触其视图”,这是我的代码,希望他们能帮助我

public async void RelacionClientesREST()
        {
            try
            {
                var dlg = ProgressDialog.Show(this, "Loading", "Cargando relación de usuarios");
                ThreadPool.QueueUserWorkItem(d => {

                    RestClient client = new RestClient("http://portalclientewa.azurewebsites.net/api/RelacionClientes/");
                    var request = new RestRequest("GetData", Method.GET);
                    request.Timeout = 1500000;
                    request.RequestFormat = DataFormat.Json;
                    request.AddParameter("idP", Idp);
                    var temp = client.Execute(request).Content;
                    var parsedJson = JsonConvert.DeserializeObject(temp).ToString();
                    var lst = JsonConvert.DeserializeObject<List<ClientesProp>>(parsedJson).ToList();
                    dataGrid.ItemsSource = lst;

                    RunOnUiThread(() => {
                        dlg.Dismiss();
                    });
                });
            }
            catch (Exception ex)
            {
                Toast.MakeText(this, "No hay datos registrados", ToastLength.Short).Show();
            }
        }
public异步void relaconclientsrest()
{
尝试
{
var dlg=ProgressDialog.Show(这是“加载”、“Cargando relación de usuarios”);
ThreadPool.QueueUserWorkItem(d=>{
RestClient=新的RestClient(“http://portalclientewa.azurewebsites.net/api/RelacionClientes/");
var request=new RestRequest(“GetData”,Method.GET);
请求超时=1500000;
request.RequestFormat=DataFormat.Json;
请求.添加参数(“idP”,idP);
var temp=client.Execute(request.Content);
var parsedJson=JsonConvert.DeserializeObject(temp.ToString();
var lst=JsonConvert.DeserializeObject(parsedJson.ToList();
dataGrid.ItemsSource=lst;
RunOnUiThread(()=>{
dlg.discouse();
});
});
}
捕获(例外情况除外)
{
Toast.MakeText(这是“No hay datos registrados”,ToastLength.Short).Show();
}
}

错误告诉您应用程序的UI必须由主线程处理。在您的代码中,您正在后台线程(ThreadPool.QueueUserWorkItem)上运行一些代码,这些代码需要在UI线程(RunOnUiThread)上运行。

错误告诉您应用程序的UI必须由主线程处理。在您的代码中,您正在后台线程(ThreadPool.QueueUserWorkItem)上运行一些代码,而这些线程需要在UI线程(RunOnUiThread)上运行。

您不能使用dlg.disease();在ThreadPool.QueueUserWorkItem内部,在尝试关闭符号之前将其移动

您不能使用dlg.disease();在ThreadPool.QueueUserWorkItem中,在尝试关闭符号之前将其移动

为什么不改用Task

Task.Run(() => doStuff("hello world"));
它看起来并没有好多少,但至少它没有一个未使用的标识符

注意:Task.Run()是.Net 4.5或更高版本。如果使用.Net 4,则必须执行以下操作:

Task.Factory.StartNew(() => doStuff("hello world"));

上面两个都使用线程池。

为什么不使用任务呢

Task.Run(() => doStuff("hello world"));
它看起来并没有好多少,但至少它没有一个未使用的标识符

注意:Task.Run()是.Net 4.5或更高版本。如果使用.Net 4,则必须执行以下操作:

Task.Factory.StartNew(() => doStuff("hello world"));
以上两个都使用线程池

只有创建视图层次结构的原始线程才能接触其视图

正如@CaPorter所说,应用程序的UI必须由主线程处理,您可以尝试将
Looper.MainLooper
Handler.Post()一起使用

按如下方式修改代码:

ThreadPool.QueueUserWorkItem(d => {

    ...

    Handler handler = new Handler(Looper.MainLooper);
    Action action = () =>
    { 
        dataGrid.ItemsSource = lst;
        dlg.Dismiss();
    };
    handler.Post(action);
});
只有创建视图层次结构的原始线程才能接触其视图

正如@CaPorter所说,应用程序的UI必须由主线程处理,您可以尝试将
Looper.MainLooper
Handler.Post()一起使用

按如下方式修改代码:

ThreadPool.QueueUserWorkItem(d => {

    ...

    Handler handler = new Handler(Looper.MainLooper);
    Action action = () =>
    { 
        dataGrid.ItemsSource = lst;
        dlg.Dismiss();
    };
    handler.Post(action);
});