Xamarin.android Xamarin Android中的进度对话框出错“;只有创建视图层次结构的原始线程才能接触其视图&x201D;
我试图在填充datagrid时使用进度对话框,但我得到以下错误:“只有创建视图层次结构的原始线程才能接触其视图”,这是我的代码,希望他们能帮助我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");
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);
});