2017-10-11 6 views
1

J'essaie d'utiliser une boîte de dialogue de progression, en remplissant une grille de données, mais j'ai l'erreur suivante: "Seulement le fil d'origine qui a créé une hiérarchie de vue peut toucher son point de vue », voici mon code, j'espère qu'ils peuvent me aiderErreur dans Xamarin Android avec un dialogue de progression "Seul le thread original qui a créé une hiérarchie de vue peut toucher ses vues"

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

Répondre

1

l'erreur vous dit doit être manipulé l'interface utilisateur de l'application par le thread principal. Dans votre code, vous exécutez du code sur un thread d'arrière-plan (ThreadPool.QueueUserWorkItem) qui doit être exécuté sur le thread d'interface utilisateur (RunOnUiThread) à la place.

0

vous ne pouvez pas utiliser dlg.Dismiss(); à l'intérieur de ThreadPool.QueueUserWorkItem, déplacez-le avant d'essayer de fermer le panneau

0

Pourquoi ne pas utiliser Task à la place?

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

Cela ne semble pas vraiment mieux, mais au moins, il n'a pas d'identificateur inutilisé.

Remarque: Task.Run() est .Net 4.5 ou version ultérieure. Si vous utilisez .Net 4, vous devez faire:

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

Les deux éléments ci-dessus utilisent le pool de threads.

0

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

Comme @CaPorter dit doivent être manipulés interface utilisateur de l'application par le fil principal. There are any number of ways to get code to execute on the UI thread, vous pouvez essayer d'utiliser Looper.MainLooper avec Handler.Post().

Modifier votre code comme ceci:

ThreadPool.QueueUserWorkItem(d => { 

    ... 

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