2

私の質問

SMSの受信を待っている間にAndroidでプログレスバーを表示するには?

ダイアログは次の条件を満たす必要があります

  • ダイアログは、最大 5 分間閉じる必要があります。
  • SMS が 5 分前に受信された場合、ダイアログは閉じる必要があります。

私が試したこと

public class GetSMS extends Activity {
   ...
   ...
   private boolean progressDialogFlag;
   private ProgressDialog progressDialog;
   ...
   ...
   new SMSReceiver().execute();
}

public class SMSReceiver extends AsyncTask<Void, Integer, Void> {
    protected void onPreExecute() {
        // start a progressdialog box
        super.onPreExecute();
        progressDialogFlag = true;
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setMessage("Waiting to Receive SMS...");
        progressDialog.setCancelable(false);
        progressDialog.show();

    }

    protected void onProgressUpdate(Integer... progress) {
        super.onProgressUpdate(progress);
        if (progressDialogFlag == true) {
            progressDialog.setProgress(progress[0]);
        }
        if (progress[0] == 100 || progressDialogFlag == false) {
            progressDialog.dismiss();
        }
    }

    protected void onPostExecute(Void result) {

    }

    @Override
    protected Void doInBackground(Void... params) {
        int interval = 2;
        int totalDuration = 5 * 60 * 1000; // 5 min
        int sleepPeriod = (totalDuration / 100) * interval;
        for (int i = 2; i <= 100; i += 2) {
            publishProgress(i);
            try {
                Thread.sleep(sleepPeriod);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

smsReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
              progressdialog = false;
   }
}

私の疑問は何ですか

  • 5 分前に SMS を受信しprogressDialogFlagたときに を閉じるために を使用すると、問題が発生すると思います。progressDialog
  • UI およびワーカー スレッドで変数progressDialogFlagを使用すると、ある種の競合状態が発生します。

手伝ってくれてありがとう。

4

2 に答える 2

0

次のようにします。

private ProgressDialog p;

private void sendSMS(){
     p = new ProgressDialog(Context);
     registerReceiver(broadcastReceiver, SMSINTENT);
}

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {

        p.dismiss();
        getActivity().unregisterReceiver(this);

    }
};

それが最善の解決策かどうかはわかりませんが、うまくいきます!

于 2012-07-02T19:32:03.933 に答える
0

progressDialog を開始するときに、以下のようなことを試すことができます

   new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
               if(null!=progressDialog && progressDialog.isShowing()){
                  // try{
                   progressDialog.dismiss();
               }

            }
        }, 5*60*1000);

しかし、さらにチェックが必要です......

于 2012-06-13T12:24:17.030 に答える