Android按钮只有在点击两次后才能工作

Android按钮只有在点击两次后才能工作,android,button,Android,Button,我的代码工作得很好,但只有在我点击两次按钮的情况下。如果我只单击一次,它将返回“limit_customers”=0 下面是返回count()的函数 有人知道会是什么吗 编辑:我将所有答案都标记为正确,因为你所有的答案都是正确的,我根据它们来解决问题。多谢各位 return amount_customers; 将在您有机会对服务器执行代码之前调用(因为服务器调用在单独的线程中运行)。这就是为什么您得到0,下次单击按钮时,您将得到第一次调用的结果,第三次单击将得到第二次调用的结果等。方法的实现执

我的代码工作得很好,但只有在我点击两次按钮的情况下。如果我只单击一次,它将返回“limit_customers”=0

下面是返回count()的函数

有人知道会是什么吗

编辑:我将所有答案都标记为正确,因为你所有的答案都是正确的,我根据它们来解决问题。多谢各位

return amount_customers;

将在您有机会对服务器执行代码之前调用(因为服务器调用在单独的线程中运行)。这就是为什么您得到0,下次单击按钮时,您将得到第一次调用的结果,第三次单击将得到第二次调用的结果等。

方法的实现执行一个异步runnable来填充
数量客户。当您第一次单击JSON解析尚未完成时,类级别变量
amount\u customers
将保持为默认值(零)。在第一次和第二次之间的某个时间点,单击runnable完成并单击该行

amount_customers = jb.getInt("count");
…正在运行。这意味着将填充类变量,从而生成显示正确值的日志输出。重要的是,第二次单击已启动另一个异步任务,以便在第二次未看到的情况下重新填充客户变量的数量

要直接获得答案,则需要同步呼叫。但是,正如您正确指出的,在I/O线程上进行网络通信的同步调用是个坏消息(会导致ANR)。您可能需要某种UI小部件,指示正在获取的客户金额的值。当解析任务返回该值时,您将希望调用侦听器方法(您将其传递到get_customers_count中),以通知依赖于该值的代码可以安全地进行处理。在这段时间内,您还需要禁用按钮按下,这样就不会发出进一步的(重复)请求。一个合理的UI应该是这样的

未按下状态。。。(正常按钮)

点击后。。。(微调器通知用户发生了什么-按钮已禁用)

在返回结果时。。。。(正常按钮)


然后根据结果执行操作。

使用
AsyncTask
而不是thread,因为线程是在后台运行的,前台流不会查看/等待

示例代码

private class GetCustomersCont extends AsyncTask<Void, Void, Void> {
    private int amount_customers = 0;
    private ProgressDialog dialog=null;
    @Override
    protected void onPreExecute() {
        dialog = new ProgressDialog(this);
    dialog.setCancelable(false);
    dialog.setMessage("Please Wait..");
    dialog.show();
    }
    @Override
    protected Void doInBackground(Void... params) {
         try{
                SoapObject request = new SoapObject(NAMESPACE, "get_count_customers");
                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                envelope.setOutputSoapObject(request);
                HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
                androidHttpTransport.call(URL + "/get_count_customers", envelope);

                SoapObject rep = (SoapObject) envelope.bodyIn;
                JSONArray jr = new JSONArray(rep.getPropertyAsString(0)); 
                JSONObject jb = (JSONObject) jr.get(0);  
                amount_customers = jb.getInt("count");
            }catch (Exception e){
                Log.e("Error:", e.toString());
            }
        return null;
    }
    @Override
    protected void onPostExecute(Void result) {
         if(dialog.isShowing())
              dialog.dismiss();
         Log.e("limit:", String.valueOf(limit_customers));
    }
}
amount_customers = jb.getInt("count");
_____________________
|                   |
|   Button label    |
|___________________|
_____________________
|                   |
| Button label {/}  |   ...{/} => spinner.
|___________________|
_____________________
|                   |
|   Button label    |
|___________________|
private class GetCustomersCont extends AsyncTask<Void, Void, Void> {
    private int amount_customers = 0;
    private ProgressDialog dialog=null;
    @Override
    protected void onPreExecute() {
        dialog = new ProgressDialog(this);
    dialog.setCancelable(false);
    dialog.setMessage("Please Wait..");
    dialog.show();
    }
    @Override
    protected Void doInBackground(Void... params) {
         try{
                SoapObject request = new SoapObject(NAMESPACE, "get_count_customers");
                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                envelope.setOutputSoapObject(request);
                HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
                androidHttpTransport.call(URL + "/get_count_customers", envelope);

                SoapObject rep = (SoapObject) envelope.bodyIn;
                JSONArray jr = new JSONArray(rep.getPropertyAsString(0)); 
                JSONObject jb = (JSONObject) jr.get(0);  
                amount_customers = jb.getInt("count");
            }catch (Exception e){
                Log.e("Error:", e.toString());
            }
        return null;
    }
    @Override
    protected void onPostExecute(Void result) {
         if(dialog.isShowing())
              dialog.dismiss();
         Log.e("limit:", String.valueOf(limit_customers));
    }
}
private GetCustomersCont mGetCustomersCont = null;


@Override
    public void onClick(View v) {
        switch(v.getId()){
            case R.id.button_to_customers:
            int limit_customers = 50;
            // R1 = Radiobutton > inside RadioGroup

            if(r1.isChecked()){
                group_id = 0;
            }else{ group_id = 1;}

            if(the_list.get(0).getSelected() == true){
               Log.e("list:", String.valueOf(the_list.get(0).getSelected()));
               // This returns true at first click (it's correct)
               if(group_id == 0){
                  Log.e("group:", String.valueOf(group_id));
                  mGetCustomersCont = new GetCustomersCont();
                  mGetCustomersCont.execute();
               }
            }
            break;
        }
    }