2011-11-28 57 views
0

我有一個按鈕的代碼,我想建立一個套接字連接,然後嘗試通過網絡發送數據。當我沒有服務器的套接字,它需要幾秒鐘的應用程序識別,我得到一個錯誤。在這段時間內,應用程序不會做任何事情(如你所期望的)爲用戶提供一個簡單的通知,告訴他應用程序沒有中斷,我想調出一個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)方法完成後會彈出進度。因此,對於我的示例,它沒有顯示任何內容(它只是掛起,直到attempToSendXML()方法完成),因爲我試圖發送數據後關閉對話框。

我希望你們能明白我的觀點並能幫助我。我一直在尋找2小時左右,真的沒有得到它...

回答

1

你不應該像attempToSendXML()長操作阻止UI線程。

相反,你應該使用一個AsyncTask。 AsyncTask也應該是解決您的問題的方法。

請參閱herehere

AsyncTask有一個onPreExecute()-方法來顯示對話框。然後將在方法doInBackground中執行attempToSendXML(),並且對話框在AsyncTask的方法onPostExecute中關閉。通過這樣做,您不會阻塞UI-Thread(並且不會獲得ANR異常),並且進度對話框顯示只要該操作在後臺工作即可。