TcpClientConnect () блокирует пользовательский интерфейс от обновления ProgressDialog - PullRequest
0 голосов
/ 02 февраля 2019

Я хочу создать программу, в которой пользователь подключается к определенному ПК с сокетом TcpClient и покажет пользователю загрузочный счетчик.

Я установил SendTimeout сокета на 10 секунд - это период времени, когда я хочу, чтобы ProgressDialog отображался.По истечении 10 секунд (или раньше - если сокет успешно создает соединение с другой стороной), я хочу закрыть диалог.

Проблема в том, что Connect () блокирует обновление пользовательского интерфейса,приводит к не отображению ProgressDialog.

TcpClient tc = new TcpClient{SendTimeout = 10000};
pd = new ProgressDialog(Activity);
pd.SetTitle("Trying to connect PC");
pd.SetMessage("Loading...");
pd.SetCancelable(false);
pd.Show();

tc.Connect(some_ip, some_port);

pd.Dismiss();

PS: я использую XAMARIN.

Обратите внимание:

  1. Я уже пытался вызвать Connect () в отдельной теме.
  2. Я уже пытался использовать AsyncTask для отображения диалога, но я не уверен, что все сделал правильно.

1 Ответ

0 голосов
/ 03 февраля 2019

Решение с AsyncTask Я обнаружил: CommunicationHandler - это статический класс, который я использую для контроля всей информации о соединении.Содержит информацию о текущем сокете, потоке, хосте и соединении.

public class LoadingTask : AsyncTask<Java.Lang.Void, Java.Lang.Void, Java.Lang.Void>
    {
        private readonly ProgressDialog pd;
        private readonly TcpClient tc;
        private readonly string ip;
        private readonly Activity activity;
        private bool IsSuccessfull { get; set; }


        public LoadingTask(ProgressDialog pd, TcpClient tc, string ip, Activity activity, string nickname)
        {
            this.pd = pd;
            this.tc = tc;
            this.ip = ip;
            this.activity = activity;
            this.IsSuccessfull = false;
        }

        protected override void OnPreExecute()
        {
            pd.Show();
        }

        protected override void OnPostExecute(Java.Lang.Void result)
        {
            pd.Dismiss();
        }

        protected override Java.Lang.Void RunInBackground(params Java.Lang.Void[] @params)
        {
            try
            {
                tc.Connect(ip, CommunicationHandler.GetPort());
                CommunicationHandler.SetSocket(this.tc, this.ip);
                IsSuccessfull = true;
                PublishProgress();
                return null;
            }
            catch
            {
                PublishProgress();
                return null;
            }
        }

        protected override void OnProgressUpdate(params Java.Lang.Void[] values) //Running when calling to PublishProgress()
        {
            if (IsSuccessfull)
            {
                Toast.MakeText(this.activity, "Successfully connected to " + this.ip + " (" + this.nickname + ")", ToastLength.Long).Show();
                activity.FindViewById<TextView>(Resource.Id.CurrentConnectionTextView).Text = "Connected to " + this.ip + " (" + this.nickname + ")";
            }
            else
                Toast.MakeText(this.activity, "Could not connect to " + this.ip + " (" + this.nickname + ")", ToastLength.Long).Show();
        }
    }
...