Я хочу создать программу, в которой пользователь подключается к определенному ПК с помощью сокета 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.
Пожалуйста, обрати внимание:
Это действительно работало в потоке пользовательского интерфейса. Итак, ваши предложения - запустить функцию Connect в фоновом потоке?
Итак, я предлагаю запустить ВЕСЬ ваш код сокета в фоновом потоке во всех версиях. Гугл даже так говорит.
AsyncTask в порядке?
да. Вы не читали документацию, на которую я ссылался? "Самый эффективный способ создать рабочий поток для более длительных операций — использовать класс AsyncTask."
Ссылки @RemyLebeau не работают на телефоне. Спасибо!
они отлично работают на моем телефоне. Я выложил их с телефона для начала
@RemyLebeau Есть ли приложение? Я использую Хром.
Вы должны переместить код сокета в рабочий поток, он не принадлежит потоку пользовательского интерфейса. Кроме того, Android изначально не позволяет использовать сокеты в основном потоке пользовательского интерфейса. Вы должны получить ошибку
NetworkOnMainThreadExceptionво время выполнения.