2017-10-11 78 views
1

我想在填充datagrid時使用進度對話框,但出現以下錯誤:「Only創建一個視圖層次可以觸摸的意見」原來的線程,這是我的代碼,我希望他們能幫助我帶有進度對話框的Xamarin Android中的錯誤「只有創建視圖層次結構的原始線程可以觸及其視圖」

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

回答

1

錯誤是告訴你的應用程序的UI必須由主線程來處理。在您的代碼中,您正在後臺線程(ThreadPool.QueueUserWorkItem)上運行一些代碼,而該代碼需要在UI線程(RunOnUiThread)上運行。

0

你不能使用dlg.Dismiss();在ThreadPool.QueueUserWorkItem裏面,在嘗試關閉標誌之前移動它

0

爲什麼不使用Task來代替?

Task.Run(() => doStuff("hello world")); 

它看起來好像不太好,但至少它沒有未使用的標識符。

注意:Task.Run()是.Net 4.5或更高版本。如果您使用的是.Net 4,您必須這樣做:

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

以上兩者都使用線程池。

0

Only the original thread that created a view hierarchy can touch its views

正如@CaPorter說,應用程序的UI必須由主線程處理。 There are any number of ways to get code to execute on the UI thread,你可以嘗試使用Looper.MainLooperHandler.Post()

修改你的代碼是這樣的:

ThreadPool.QueueUserWorkItem(d => { 

    ... 

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