/ / Android mostra ProgressDialog antes do socket.connect - android, multithreading, progressdialog

Android show ProgressDialog antes de socket.connect - android, multithreading, progressdialog

Estou tentando mostrar um ProgressDialog antes de eu ligar socket.connect() no meu aplicativo Android. Infelizmente, a caixa de diálogo aparece apenas depois de a socket.connect() O método está concluído. Aqui está o que eu faço:

public void connect() throws IOException
{
try
{
final ProgressDialog dialog = ProgressDialog.show(remoteActivity, "Connecting", "please wait...");

socket.connect(sockaddr,timeout);

ipAddress = socket.getLocalAddress();
oos = new ObjectOutputStream(socket.getOutputStream());
ois = new ObjectInputStream(socket.getInputStream());

dialog.dismiss();
}
catch(IOException e)
{
throw e;
}
}

Eu sei que eu poderia usar um Thread diferente para chamar socket.connect(), mas não quero que esse método seja executado de forma assíncrona, pois quero usar o mecanismo de exceção.

Respostas:

0 para resposta № 1

Você nunca deve executar operações de rede ou, de fato, qualquer entrada / saída no Main/UI Thread. em cima desse android introduzido NetworkOnMainThreadException forçar os desenvolvedores a evitar o uso do thread principal para a criação de redes. esta discussão destina-se a

  • Atualize os componentes da interface do usuário.
  • receber e gerar eventos para o usuário.

qualquer coisa, exceto que melhor seja feito em um thread separado. agora sobre o Exception mecanismo, você pode usar um indicador booleano, em vez de a conexão ter sido bem-sucedida ou não. se você deseja recuperar a exceção aqui, é uma maneira de transmiti-la:

private void handleException(Exception e){
// do whatever you want with the exception
}
public void connect() {

final ProgressDialog dialog = ProgressDialog.show(remoteActivity, "Connecting", "please wait...");
final Handler handler = new Handler():
new Thread(){
@Override
public void run(){
try{
socket.connect(sockaddr,timeout);

ipAddress = socket.getLocalAddress();
oos = new ObjectOutputStream(socket.getOutputStream());
ois = new ObjectInputStream(socket.getInputStream());
handler.post(new Runnable(){
@Override
public void run(){
dialog.dismiss();
}
});
} (catch(final IOException e)
{
handler.post(new Runnable(){
@Override
public void run(){
handleException(e);
dialog.dismiss();
}
});
}
}.start();

}

}

0 para resposta № 2

Crie classe personalizada, estenda ProgressDialog, coloque a conexão no construtor e chame o método connect dentro da função show da substituição


-2 para resposta № 3

Tente antecipar seu segmento para que a interface do usuário tenha chance de agir. Por exemplo:

final ProgressDialog dialog = ProgressDialog.show(remoteActivity, "Connecting", "please wait...");
Thread.sleep(1);
socket.connect(sockaddr,timeout);