【问题标题】:Showing a progressDialog from an OptionsMenu从 OptionsMenu 显示 progressDialog
【发布时间】:2016-01-26 14:49:36
【问题描述】:

我知道以下可能不是最佳做法,不建议这样做。

我有一个向服务器发送数据的 AsyncTask。我需要做的整个过程包括快速连续使用此 AsyncTask 的 4 个 Web 调用。

我了解使用 AsyncTask 必须在 OnPreExecute 和 OnPostExecute 中启动和停止 ProgressDialog。我通常会这样做。

问题是我一个接一个地连续调用 4 个 AsyncTask,所以我不希望 4 个进度对话框一个接一个地重复。

我使用 AsyncTask.execute().get(),所以它们是按顺序调用的。

我从 optionsMenu 循环调用这些 AsyncTask。我要做的是设置一个全局 ProgressDialog,我可以在循环之前在 optionsMenu 中启动它并在循环之后取消它。

问题是它没有显示。我想可能是因为它需要在 UI 线程上运行,所以我将它放在了一个 Handler 中,但仍然没有运气。

如何在 optionsMenu 中显示进度对话框?

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menuclientassessment, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.sendclientassessment:

            new Handler(Looper.getMainLooper()).post(new Runnable() {
                @Override
                public void run() {

                    progressDialog2 = new ProgressDialog(ClientAssessmentActivity.this);
                    progressDialog2.setTitle("Connecting to Server");
                    progressDialog2.setMessage("Sending the assessment to server...");
                    progressDialog2.setIndeterminate(true);

                    try {
                        progressDialog2.show();
                    } catch(Exception e){
                        //ignore
                    }
                }
            });

            for(int i = 0; i < arr.size(); i++) {
                String [] params = new String[6];

                AssessmentScore as = null;
                as = arr.get(i);

                params[0] = clientID;
                params[1] = carerID;
                params[2] = comments.getText().toString();

                DateTime now = new DateTime();
                DateTimeFormatter df = DateTimeFormat.forPattern("yyyy-MM-dd'T'H:mm");
                String formattedNowTime = df.print(now);
                params[3] = formattedNowTime;

                params[4] = as.getElementID();
                params[5] = as.getValue();

                AsyncSendAssessment asa = null;
                asa = new AsyncSendAssessment();
                try {
                    asa.execute(params).get();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }//end of loop

            new Handler(Looper.getMainLooper()).post(new Runnable() {
                @Override
                public void run() {
                    try {
                        progressDialog2.dismiss();
                        } catch(Exception e) {
                            //ignore
                        }
                }
            });

            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

【问题讨论】:

    标签: android android-asynctask progressdialog android-optionsmenu


    【解决方案1】:

    让进度对话框成为一个类变量,然后在创建活动时实例化它。这样您就可以在应用程序的任何位置访问它。

    【讨论】:

    • 这是我尝试过的,除了我在选项菜单中实例化了对话框。当我按照您的建议在 onCreate 中实例化它时,它仍然没有显示。
    • 尝试在处理程序之外调用类方法以显示进度对话框。
    【解决方案2】:

    将您的对话框创建为扩展类Dialog 的类。例如。 -TestDialog。然后使用对话框创建一个具有常用功能的 Util 类。

    public class TestDialog extends Dialog {
    }
    

    实用程序:

    public class TestDialogUtil {
       public static TestDialog processingDialog;
    
       public static void createProcessingDialog();
       public static void dismissProcessingDialog();
    
    } 
    

    然后在您的任何活动中调用TestDialogUtil.createProcessingDialogTestDialogUtil.dismissProcessingDialog。您不会创建额外的对话框。仅当processingDialog 不为空时才创建新对话框。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多