0

AndroidアプリケーションProgressDialogを呼び出す前に表示しようとしています。socket.connect()残念ながら、ダイアログはメソッドが終了した後にのみ表示されます。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;
    }
}

別のスレッドを使用して呼び出すことができることはわかってsocket.connect()いますが、Exceptionメカニズムを使用したいので、このメソッドを非同期で実行したくありません。

4

3 に答える 3

0

カスタムクラスを作成し、拡張ProgressDialogし、コンストラクターに接続を配置し、overrideshow関数内でconnectメソッドを呼び出します

于 2013-03-27T13:07:07.307 に答える
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 に答える
-2

UIが機能するように、スレッドをプリエンプトしてみてください。例えば:

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