-1

私はアンドロイドが初めてです。ユーザーがログインボタンをクリックしたときに進行状況ダイアログを表示したい。これを試しましたが、ダイアログが表示されません

btn_logIn.setOnClickListener(new OnClickListener() {
     @Override
     public void onClick(View view) {
         getUserCredentials();
     }
}); //end of anonymous class

private void showProgressDialog() {     
    if (dialog == null) {       
        dialog = new ProgressDialog(this);          
    }
    dialog.setMessage("Please Wait. Your authentication is in progress");
    dialog.setButton("Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which)              
            dialog.dismiss();               
        }           
    }); //end of anonymous class        
    dialog.show();  
} //end of showProgressDialog()

private void getUserCredentials() {

    EditText txt_userName = (EditText) findViewById(R.id.txt_userName);
    String userName = txt_userName.getText().toString();

    EditText txt_password = (EditText) findViewById(R.id.txt_password);
    String password = txt_password.getText().toString();

    if (userName != null && !userName.trim().equals("") && password != null && !password.trim().equals("")) {                   
        showProgressDialog();       
        callWebService(userName, password);         
    }
} //end of getUserCredentials()

private void callWebService(String userName, String password) {

    try {

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
        request.addProperty("userName", userName);
        ....            
        Object result = envelope.getResponse();             
        if (result.equals("true")) {                
            dialog.dismiss();
            Toast.makeText(this, result.toString(), Toast.LENGTH_SHORT).show();

        } else {                
            dialog.dismiss();
            Toast.makeText(this, result.toString(), Toast.LENGTH_SHORT).show();                             
        }

     } catch (SocketTimeoutException e) {            
         dialog.dismiss();
         Toast.makeText(this, "Service is not connected, Please make sure your server is running", Toast.LENGTH_LONG).show();                       
    }  catch(Exception e) {         
        e.printStackTrace();
        dialog.dismiss();
        Toast.makeText(this, "Unable to connect, please try again later. Thank you", Toast.LENGTH_LONG).show();                     
     }
} //end of callWebServide()

私は何か間違ったことをしていますか?ログインボタンをクリックしてサービスが実行されていない場合、「サービスが接続されていないことを確認してください。サーバーが実行されていることを確認してください」というメッセージが表示されますが、ダイアログが表示されません...なぜですか?私のロジックは、ユーザーがログインをクリックしたときですボタンとフィールドに値があり、進行状況ダイアログの表示を開始し、結果が来たとき、サーバーが実行されていないとき、または例外が発生した場合などに何かが発生した場合、ダイアログを削除して適切なメッセージを表示しますが、ダイアログが表示されません...なぜ? 私は何を間違っていますか? 助けてください..

ありがとう

4

2 に答える 2

0

これを試して、

getUserCredentials() を次のように変更します。

private void getUserCredentials() {

    EditText txt_userName = (EditText) findViewById(R.id.txt_userName);
    String userName = txt_userName.getText().toString();

    EditText txt_password = (EditText) findViewById(R.id.txt_password);
    String password = txt_password.getText().toString();

    if (userName != null && !userName.trim().equals("") && password != null && !password.trim().equals("")) {                   
        showProgressDialog();
 Thread t=new Thread(new Runnable() {

        public void run() {
             callWebService(userName, password);  

        }
    });   t.start();    
  }
}

そして、あなたのcallWebServiceメソッドはこのように、

private void callWebService(String userName, String password) {

try {

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    request.addProperty("userName", userName);
    ....            
    Object result = envelope.getResponse();             
    if (result.equals("true")) {                
        dialog.dismiss();
        Toast.makeText(this, result.toString(), Toast.LENGTH_SHORT).show();

    } else {  
        ActivityName.this.runOnUiThread(new Runnable() {

    public void run() {
         dialog.dismiss();
        Toast.makeText(this, result.toString(), Toast.LENGTH_SHORT).show();  

    }
});              

    }

 } catch (SocketTimeoutException e) {  
      ActivityName.this.runOnUiThread(new Runnable() {

    public void run() {
          dialog.dismiss();
     Toast.makeText(this, "Service is not connected, Please make sure your server is running", Toast.LENGTH_LONG).show();                       
    }
});           

}  catch(Exception e) {         
    e.printStackTrace();
 ActivityName.this.runOnUiThread(new Runnable() {
    public void run() {
           dialog.dismiss();
    Toast.makeText(this, "Unable to connect, please try again later. Thank you", Toast.LENGTH_LONG).show();                       
    }
});   

 }

}

更新 1

あなたのコメントからあなたの質問に答えるために、

1) はい Async Task の方が効率的です。ここで説明したのと同じタスクを実行する独自のメソッドがあります。

AsyncTask には次のメソッドがあります。

i)onPreExecute() - ダイアログを開始するために使用できます。 ii)doInBackground() - バックグラウンド スレッドとして機能します。iii)onPostExecute() - ダイアログを閉じることができる最後に呼び出されます。

言及しなかった理由は、Async タスクに適応するために作業コードの構造を変更しなければならない可能性があるためです。

2) runonUiThread - 名前が示すように、この内部のすべてがメイン UI スレッドで実行されていると見なされます。したがって、基本的に画面を更新するには、これを使用する必要があります。同じタスクを実行できるハンドラーなど、他の方法も利用できます。

于 2012-06-29T05:55:12.133 に答える
0

その時点でタスクが開始されるたびに AsyncTask を使用してウィジェットを初期化し、run メソッドから Web サービスを呼び出し、stop メソッドで進行状況バーを閉じます。

于 2012-06-29T05:42:33.303 に答える