直接打开Dialogs?

时间:2011-11-28 15:17:00

标签: android android-alertdialog

我有一个Button的代码,我想建立一个Socket Connection,然后尝试通过网络发送数据。当我没有服务器用于套接字时,在应用程序识别并且我收到错误之前需要几秒钟。在这个时候,应用程序不做任何事情(正如你所料)为用户提供一个简单的通知,告诉他应用程序没有损坏,我想提出一点ProgressBar。

private void sendButtonListener(Button sendButton, final String server,
        final int port) {
    sendButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            refreshInput();

            showDialog(DIALOG_CONNECTING);
            //Getting the SocketConnection and try to send the Data
            attempToSendXML(builder, profilename);
            dismissDialog(DIALOG_CONNECTING);
        }
    });
}

我的问题是,在showDialog()方法完成后,似乎onClick(View v)方法会调出ProgressBar。因此,对于我的示例,它只显示任何内容(它只是挂起,直到attempToSendXML()方法完成),因为我在尝试发送数据后关闭了Dialog。

我希望你们能得到我的观点并帮助我。我一直在寻找2个小时,真的不明白......

1 个答案:

答案 0 :(得分:1)

您不应该使用像attempToSendXML()这样的长操作阻止UI线程。

相反,你应该使用AsyncTask。 AsyncTask也应该是解决问题的方法。

请参阅herehere

AsyncTask有一个onPreExecute() - 方法,您可以在其中显示对话框。然后将在方法attempToSendXML()中执行doInBackground,并在AsyncTask的方法onPostExecute中关闭对话框。通过这种方式,您不会阻止UI-Thread(并且不会获得ANR异常),并且进度对话框会显示操作在后台运行的时间。