1

私のコードは完全に機能しますが、ボタンを 2 回クリックした場合のみです。1 回だけクリックすると、"limit_customers" = 0 が返されます。

@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));
                  // returns 0 at first click (it's correct)
                  limit_customers = get_customers_count();
                  Log.e("limit:", String.valueOf(limit_customers));
                  // returns 0 at first click (it's INCORRECT) 
                  // at second click returns 3 (it's correct)

               }
            }
            break;
        }
    }

count(); を返す関数は次のとおりです。

public int get_customers_count(){
    ExecutorService mExec = Executors.newSingleThreadExecutor();
    mExec.execute(new Runnable() {
        @Override
        public void run() {             
            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 amount_customers;
}

誰でもそれが何であるかについて何か考えがありますか?

編集:あなたの答えはすべて正しいので、すべての答えを正しいとマークしました。私はそれらに従って問題を解決します。ありがとうございました。

4

3 に答える 3

1

AsyncTaskスレッドはバックグラウンドで実行され、フォアグラウンド フローはそれを検索/待機しないため、スレッドの代わりに使用します。

サンプルコード、

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));
    }
}

そしてonClick()

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;
        }
    }
于 2013-10-18T12:03:09.780 に答える
1
return amount_customers;

サーバーに対してコードを実行する前に呼び出されます (サーバー呼び出しは別のスレッドで実行されるため)。そのため、次にボタンをクリックすると、最初の呼び出しの結果が得られ、3 回目のクリックの結果が 2 番目の呼び出しの結果になります。

于 2013-10-18T11:40:40.117 に答える