Почему глобальный объект приводит к неработающему коду? - PullRequest
0 голосов
/ 05 июня 2019

У меня довольно простое приложение для Android.Большая часть этого все еще из шаблона.Я использую собственную библиотеку классов для клиента XMPP.Теперь происходит то, что если я объявляю глобальный TextView для использования в событиях или в других методах (OnCreate, OnResume и т. Д.), Мои события, похоже, не возникают.Моя библиотека определенно не является причиной, так как я тестировал ее при других обстоятельствах.

[Activity(Label = "@string/app_name", Theme = "@style/AppTheme.NoActionBar", MainLauncher = true)]
    public class MainActivity : AppCompatActivity
    {
        public XMPPClient client;
        TextView consoleText;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.activity_main);

            Android.Support.V7.Widget.Toolbar toolbar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
            SetSupportActionBar(toolbar);

            FloatingActionButton fab = FindViewById<FloatingActionButton>(Resource.Id.fab);
            fab.Click += FabOnClick;

            //consoleText = FindViewById<TextView>(Resource.Id.consoleText);

            client = new XMPPClient("10.0.2.2", 5222, "chris3", "Define")
            {
                AuthenticationInfo = true
            };

            client.OnPublishEvent += Client_OnPublishEvent;
            client.OnConnection += Client_OnConnection;
            client.OnMessageReceived += Client_OnMessageReceived;
        }

        private void Client_OnMessageReceived(object sender, MessageEventArgs e)
        {
            //consoleText.Text += "\nMessage: " + e.text + " from " + e.from;
            Log.Debug("mytag", "Message!");
        }

        private void Client_OnPublishEvent(object sender, SubscriptionEventArgs e)
        {
            //consoleText.Text += "\nPublication: " + e.title + " with content " + e.content + " at " + e.published;
            Log.Debug("mytag", "Publication");
        }

        private void Client_OnConnection(object sender, ConnectionEventArgs e)
        {
            //consoleText.Text += "\nConnection status changed: " + e.Status;
            Log.Debug("mytag", "ConnectionChange");
        }

        public override bool OnCreateOptionsMenu(IMenu menu)
        {
            MenuInflater.Inflate(Resource.Menu.menu_main, menu);
            return true;
        }

        public override bool OnOptionsItemSelected(IMenuItem item)
        {
            int id = item.ItemId;
            if (id == Resource.Id.action_subscribe)
            {
                client.Subscribe("Node1");
                Log.Debug("mytag", "Subscribed");
                return true;
            }

            return base.OnOptionsItemSelected(item);
        }

        private void FabOnClick(object sender, EventArgs eventArgs)
        {
            View view = (View) sender;
            client.Connect();
        }
    }

Когда там присутствует объект TextView consoleText, мое OnConnection-событие запускается в начале и при закрытии клиента.Однако, если его там нет, каждое событие работает отлично.Пока я новичок в Xamarin, я действительно заинтересован в источнике проблемы.

1 Ответ

1 голос
/ 06 июня 2019

Скорее всего, вам нужно обернуть текстовые назначения для обработки в основном диспетчере (поток пользовательского интерфейса).

Так, например, это будет выглядеть примерно так:

private void Client_OnMessageReceived(object sender, MessageEventArgs e)
{
    Activity.RunOnUiThread(() => {
        consoleText.Text += "\nMessage: " + e.text + " from " + e.from;
    });

    Log.Debug("mytag", "Message!");
}

Попробуйте и дайте мне знать, если это все еще ошибка, не забывайте, что вам нужно обернуть все consoleText.Text назначения внутри этого.

Activity.RunOnUiThread(() => {
});

// You might not need the Activity part, I can't remember exactly which 
// one it is for an AppCompatActivity.

RunOnUiThread(() => {
});
...