TcpClientConnect() зависает в пользовательском интерфейсе

Я хочу создать программу, в которой пользователь подключается к определенному ПК с помощью сокета 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, чтобы показать диалог, но я не уверен, что сделал это правильно.

Вы должны переместить код сокета в рабочий поток, он не принадлежит потоку пользовательского интерфейса. Кроме того, Android изначально не позволяет использовать сокеты в основном потоке пользовательского интерфейса. Вы должны получить ошибку NetworkOnMainThreadException во время выполнения.

Remy Lebeau 03.02.2019 04:58

Это действительно работало в потоке пользовательского интерфейса. Итак, ваши предложения - запустить функцию Connect в фоновом потоке?

Daniel Reyhanian 03.02.2019 07:25
документация Google говорит: "[NetworkOnMainThreadException] возникает, когда приложение пытается выполнить сетевую операцию в своем основном потоке. Это вызывается только для приложений, предназначенных для Honeycomb SDK или выше. Приложениям, ориентированным на более ранние версии SDK, разрешено работать в сети в своих основных потоках цикла событий, но это сильно обескураживает.
Remy Lebeau 03.02.2019 09:18

Итак, я предлагаю запустить ВЕСЬ ваш код сокета в фоновом потоке во всех версиях. Гугл даже так говорит.

Remy Lebeau 03.02.2019 09:21

AsyncTask в порядке?

Daniel Reyhanian 03.02.2019 10:12

да. Вы не читали документацию, на которую я ссылался? "Самый эффективный способ создать рабочий поток для более длительных операций — использовать класс AsyncTask."

Remy Lebeau 03.02.2019 18:18

Ссылки @RemyLebeau не работают на телефоне. Спасибо!

Daniel Reyhanian 03.02.2019 20:58

они отлично работают на моем телефоне. Я выложил их с телефона для начала

Remy Lebeau 03.02.2019 22:57

@RemyLebeau Есть ли приложение? Я использую Хром.

Daniel Reyhanian 03.02.2019 23:03
0
9
61
0

Другие вопросы по теме