0

我试图ProgressDialog在调用socket.connect()我的 Android 应用程序之前显示一个。不幸的是,该对话框仅在方法完成后出现。socket.connect()这是我所做的:

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

我知道我可以使用不同的 Thread 来调用socket.connect(),但我不希望此方法异步运行,因为我想使用 Exception 机制。

4

3 回答 3

0

您永远不应该执行网络操作或事实上任何输入/输出在Main/UI Thread. 最重要的是,android 引入了NetworkOnMainThreadException以强制开发人员避免使用主线程进行网络操作。该线程旨在

  • 更新用户界面组件。
  • 为用户接收和生成事件。

除了最好在单独的线程中完成之外的任何事情。现在关于Exception机制,您可以使用布尔指标来代替连接是否成功。如果您在此处获取异常时乱伦,则可以将其传回:

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();

}

}
于 2013-03-27T13:15:18.573 回答
0

创建自定义类,扩展ProgressDialog,将连接放入构造函数并在覆盖显示函数中调用连接方法

于 2013-03-27T13:07:07.307 回答
-2

尝试抢占您的线程,以便 UI 有机会采取行动。例如:

final ProgressDialog dialog = ProgressDialog.show(remoteActivity, "Connecting", "please wait...");
Thread.sleep(1);
socket.connect(sockaddr,timeout);
于 2013-03-27T13:06:50.820 回答