我收到错误error: Only the original thread that created a view hierarchy can touch its views
在行
BookingAdapter expListAdapter = new BookingAdapter (this, listDataHeader, listDataChild);
try{
explistView.SetAdapter (expListAdapter);
explistView.SetGroupIndicator (null);
}
catch(Exception e) {
Toast.MakeText (this,e+"",ToastLength.Long).Show();
}
这是我的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using System.ServiceModel.Web;
using SalonServices;
using System.ServiceModel;
namespace PariSalon
{
[Activity (Label = "BookingRequest")]
public class BookingRequest : Activity
{
public List<GetServices> listDataHeader;
public List<GetServices> services;
Dictionary<GetServices, List<String>> listDataChild;
ExpandableListView explistView;
public static readonly EndpointAddress EndPoint = new EndpointAddress("http://xxx.xxx.Xx.xx/SalonService/SalonServices.svc");
//public static readonly EndpointAddress EndPoint = new EndpointAddress("http://xxxx");
private SalonServicesClient serviceClient;
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
SetContentView(Resource.Layout.Booking_request);
InitializeSalonServiceClient();
Button submit = FindViewById<Button> (Resource.Id.button2);
//string userid = "1";
//serviceClient.GetServicesForUserAsync (userid);
string userid = "1";
serviceClient.GetServicesForUserAsync (userid);
//serviceClient.GetServicesForUserAsync (userid);
submit.Click += delegate {
Intent intent = new Intent(this, typeof(Booking_Request_sent));
StartActivity(intent);
};
// Create your application here
/*
explistView.SetOnGroupClickListener( new OnGroupClickListener());
//Catch click event attempt 2
explistView.GroupClick += (object pobjSender, ExpandableListView.GroupClickEventArgs pArgs) =>
{
int len = expListAdapter.GroupCount;
for(int i=0;i<len;i++)
{
if(i!=groupPosition)
{
explistView.CollapseGroup(i);
}
if(i==groupPosition){
if(explistView.IsGroupExpanded(groupPosition)){
explistView.CollapseGroup(groupPosition);
}
else {
explistView.ExpandGroup(groupPosition);
}
}
}
};*/
}
private void InitializeSalonServiceClient()
{
BasicHttpBinding binding = CreateBasicHttp();
serviceClient = new SalonServicesClient(binding, EndPoint);
//serviceClient.GetServicesForUserCompleted += GetServicesForUserCompleted;
//serviceClient.GetProductDetailsCompleted += GetProductDetailsCompleted;
serviceClient.GetServicesForUserCompleted += GetServicesForUserCompleted;
}
private void GetServicesForUserCompleted(object sender, GetServicesForUserCompletedEventArgs getServiceDataCompletedEventArgs)
{
string msg = null;
if (getServiceDataCompletedEventArgs.Error != null)
{
msg = getServiceDataCompletedEventArgs.Error.Message;
}
else if (getServiceDataCompletedEventArgs.Cancelled)
{
msg = "Request was cancelled.";
}
else
{
services = new List<GetServices>(getServiceDataCompletedEventArgs.Result);
prepareListData ();
explistView = FindViewById<ExpandableListView> (Resource.Id.expandableselectservicetype);
BookingAdapter expListAdapter = new BookingAdapter (this, listDataHeader, listDataChild);
try{
explistView.SetAdapter (expListAdapter);
explistView.SetGroupIndicator (null);
}
catch(Exception e) {
Toast.MakeText (this,e+"",ToastLength.Long).Show();
}
}
}
private static BasicHttpBinding CreateBasicHttp()
{
BasicHttpBinding binding = new BasicHttpBinding
{
Name = "basicHttpBinding",
MaxBufferSize = 2147483647,
MaxReceivedMessageSize = 2147483647
};
TimeSpan timeout = new TimeSpan(0, 0, 50);
binding.SendTimeout = timeout;
binding.OpenTimeout = timeout;
binding.ReceiveTimeout = timeout;
return binding;
}
private void prepareListData() {
listDataHeader = new List<GetServices>();
listDataChild = new Dictionary<GetServices, List<String>>();
listDataHeader.Clear ();
if (services != null) {
foreach (GetServices pd in services) {
listDataHeader.Add (pd);
}
// Adding child data
//listDataHeader.Add("Top 250/n");
//listDataHeader.Add("Now Showing");
//listDataHeader.Add("Coming Soon..");
List<String> childLabel = new List<String> ();
childLabel.Add ("Date :");
childLabel.Add ("Time :");
childLabel.Add ("User :");
childLabel.Add ("Second User:");
childLabel.Add ("Status :");
childLabel.Add ("Cancel ");
listDataChild.Add (listDataHeader.ElementAt (0), childLabel); // Header, Child data
listDataChild.Add (listDataHeader.ElementAt (1), childLabel);
listDataChild.Add (listDataHeader.ElementAt (2), childLabel);
}
}
}
}
我有另一个适配器类,但我认为错误只在这个类中。我怎么解决这个问题。任何人都可以帮我解决这个问题。
答案 0 :(得分:5)
接受的答案中的链接文章谈到InvokeOnMainThread
这是一个IOS的事情。不知道为什么它被接受为Android的答案,因为问题被标记了。
对于Android,您使用Activity.RunOnUiThread
。相关文档在此处:http://developer.xamarin.com/guides/android/advanced_topics/writing_responsive_applications/
因为你是从继承自Activity
的地方进行操作的,所以你可以将相关的代码包装起来:
BookingAdapter expListAdapter = new BookingAdapter (this, listDataHeader, listDataChild);
try{
explistView.SetAdapter (expListAdapter);
explistView.SetGroupIndicator (null);
}
catch(Exception e) {
Toast.MakeText (this,e+"",ToastLength.Long).Show();
}
变为:
RunOnUiThread(() =>
{
BookingAdapter expListAdapter = new BookingAdapter (this, listDataHeader, listDataChild);
try{
explistView.SetAdapter (expListAdapter);
explistView.SetGroupIndicator (null);
}
catch(Exception e) {
Toast.MakeText (this,e+"",ToastLength.Long).Show();
}
});
这就是它的全部内容。
答案 1 :(得分:0)
您正在工作线程上从GetServicesForUserCompleted
调用SalonServicesClient
方法。而是在UI thread上调用它。