【问题标题】:Progress dialog is not showing while calling a web service调用 Web 服务时不显示进度对话框
【发布时间】:2012-06-29 05:34:10
【问题描述】:

我是安卓新手。我想在用户单击登录按钮时显示进度对话框。我试过了,但对话框没有显示

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

我是不是做错了什么。当我单击登录按钮并且服务未运行时,它显示消息 服务未连接,请确保您的服务器正在运行“,但对话框未显示...为什么?我的逻辑是当用户单击登录按钮并且字段具有值然后开始显示进度对话框并且如果发生任何事情,例如结果出现或服务器未运行或发生任何异常,然后我删除对话框并显示适当的消息,但对话框不是'不显示...为什么?我做错了什么?请帮助..

谢谢

【问题讨论】:

    标签: android


    【解决方案1】:

    试试这个,

    像这样改变你的 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

    为了回答您的 cmets 的问题,

    1)Yes Async Task 更高效。它有自己的方法来完成我在此处描述的相同任务。

    AsyncTask 有以下方法,

    i)onPreExecute() - 可以用来启动你的对话框 ii)doInBackground()——充当后台线程。 iii)onPostExecute()——在你可以关闭对话框的最后被调用。

    我没有提到的原因是,您可能必须更改工作代码的结构以适应异步任务。

    2)runonUiThread- 顾名思义,其中的任何内容都将被视为在主 UI 线程中运行。所以基本上要更新屏幕,你必须使用它。还有其他可用的方法,例如也可以执行相同任务的处理程序。

    【讨论】:

    • 您好,谢谢。它在public void run() { callWebServide(userName, password);} 行给我错误Can not refer to a non final variable userName inside an inner class defined in a different method。我怎样才能删除这个?为什么我会收到此错误?
    • 好的。不是问题。您能否将用于从 EditTexts 获取文本的字符串用户名和密码分配为活动顶部的全局变量。
    • 是的,如果它对我的代码没有负担(意思是垃圾收集器)你的意思是作为一个实例变量?
    • 我想我也应该将结果变量声明为实例变量Object result。因为我们也在内部类中使用它。您也可以在每个条件下使用ActivityName.this.runOnUiThread{},但不在代码if (result.equals("true")) {dialog.dismiss(); } 中使用。有什么特别的原因吗?
    • 是的。您还必须将该变量声明为全局变量。一旦你完成它,你就可以把它归零。对不起,我错过了那部分。你还需要在那里添加runonUi
    【解决方案2】:

    当任务启动时使用 AsyncTask 初始化您的小部件,然后从 run 方法调用您的 web 服务并在 stop 方法上关闭您的进度条。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多