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 № 1Você 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);