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