2

我的问题

如何在等待接收短信时在android中显示进度条?

对话框应满足以下条件

  • 对话最多应关闭 5 分钟。
  • 如果在 5 分钟之前收到 SMS,则应关闭该对话框。

我试过的

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 分钟前收到短信时,使用progressDialogFlag取消会导致问题。progressDialog
  • 在 UI 和工作线程中使用变量progressDialogFlag会导致某种竞争条件。

感谢帮助。

4

2 回答 2

0

Do like this:

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

    }
};

Don't know if it is the best solution, but it works!

于 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 回答