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

Android muestra ProgressDialog antes de socket.connect - Android, multithreading, progressdialog

Estoy tratando de mostrar un ProgressDialog antes de llamar socket.connect() en mi aplicación de Android. Lamentablemente, el cuadro de diálogo solo aparece después el socket.connect() El método está terminado. Esto es lo que hago:

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;
}
}

Sé que podría usar un hilo diferente para llamar socket.connect(), pero no quiero que este método se ejecute de forma asincrónica, ya que quiero usar el mecanismo de excepción.

Respuestas

0 para la respuesta № 1

Nunca debe realizar operaciones de red o, de hecho, ninguna entrada / salida en el Main/UI Thread. en la parte superior de ese androide introducido NetworkOnMainThreadException para forzar a los desarrolladores a evitar usar el hilo principal para redwrking. este hilo está destinado a

  • Actualizar componentes de la interfaz de usuario.
  • recibir y generar eventos para el usuario.

cualquier cosa excepto que sea mejor hacerlo en un hilo separado. ahora con respecto a la Exception mecanismo puede utilizar un indicador booleano en lugar de que la conexión se haya realizado correctamente o no. Si usted incesta para recuperar la excepción aquí, es una forma de pasarla:

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 la respuesta № 2

Crear clase personalizada, ampliar ProgressDialog, ponga la conexión en el constructor y llame al método de conexión dentro de la función show override


-2 para la respuesta № 3

Intenta evitar tu hilo para que la interfaz de usuario tenga la oportunidad de actuar. Por ejemplo:

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