【问题标题】:ProgressDialog on a fragment class not appearing immediately after button click片段类上的 ProgressDialog 在按钮单击后没有立即出现
【发布时间】:2016-11-04 18:42:30
【问题描述】:

我在单击按钮时有一个 Fragment 类,我应该显示一个包含内容的表格视图,根据要显示的内容,这需要 4 秒或更长时间的时间跨度。所以我想在按钮单击后显示一个 progressDialog 并在我的方法执行后关闭。

但是这个过程是在延迟之后出现的,就像在 tableview 出现之后。所以显示进度条有延迟。我尝试了很多方法仍然没有运气。

下面是我正在尝试的代码。

  @Override
    public void onClick(final View v) {

        switch (v.getId()) {
        case R.id.btn_spreadsheetAddTable: {
            //Some code
        }
            break;

        case R.id.btn_horizontalAddTable: {

            AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
                @Override
                protected Void doInBackground(Void... params) {

                    return null;
                }

                @Override
                protected void onPreExecute() {
                    mProgressDialog = new ProgressDialog(getActivity());
                    mProgressDialog.setTitle("Processing...");
                    mProgressDialog.setMessage("Please wait.");
                    mProgressDialog.setCancelable(false);
                    mProgressDialog.setIndeterminate(true);
                    mProgressDialog.show();
                   displayAddTableView(editIsEnabled);

                }

                @Override
                protected void onPostExecute(Void result) {
                    if (mProgressDialog!=null) {
                        mProgressDialog.dismiss();

                    }
                }
            };
            task.execute((Void[])null);



            editIsEnabled = false;

        }

private void displayAddTableView(boolean editEnabled) {
//A code to display dynamic table with dynamic data
}
}

我也尝试过以下网址:

android - Progressbar Late Loading when button click

Loading Dialog, Progress Dialog on Button Click

ProgressDialog doesn't appear immediately

请帮助我。谢谢。

【问题讨论】:

    标签: android progressdialog


    【解决方案1】:

    您说显示需要 4 秒。听起来无论你做什么都应该在后台线程中完成,而不是 UI 线程。也许您想在doInBackground 中执行displayAddTableView(editIsEnabled);,并发布任何UI 更新。

    mProgressDialog.show() 导致消息被发布到 UI 消息队列,这意味着如果您的 UI 线程正忙于运行 displayAddTableView(editIsEnabled);,进度微调器将不会显示(或将在瞬间显示之后 displayAddTableView(editIsEnabled); 已运行完毕)。

    【讨论】:

    • 我尝试从 doInBacground() 调用 displayAddTableView(editIsEnabled) 并在 displayAddTableView(editIsEnabled) 内的 table.show 移动到 onPostExecute。然后我的微调器出现在按钮点击上。但是崩溃给我下面的异常-java.lang.RuntimeException:无法在未调用 Looper.prepare() 的线程内创建处理程序。
    • displayAddTableView 中更新 UI 的任何内容都需要放在对 runOnUiThread() 的调用中。
    • @reetu 表格视图也应该有一个post 方法,基本上做同样的事情。
    • 我已经在 runOnUiThread() 中完成了所有的 UI 工作——它位于 displayAddTableView 中。现在也不例外,但我也看不到进度条。
    【解决方案2】:

    可能是您的设备或模拟器速度慢。您可以先初始化进度对话框,然后在 onPreExecute 上显示:

    ProgressDialog mProgressDialog;
    .
    .
    .     //in oncreate
           mProgressDialog = new ProgressDialog(getActivity());
            mProgressDialog.setTitle("Processing...");
            mProgressDialog.setMessage("Please wait.");
            mProgressDialog.setCancelable(false);
            mProgressDialog.setIndeterminate(true);
    
    
    .
    .
    .
    protected void onPreExecute() {
    mProgressDialog.show();
    

    【讨论】:

    • 你是用模拟器还是设备测试?
    【解决方案3】:

    我已通过添加 toast 并在 UIThread 中运行表格设计代码来解决此问题,因为无法显示进度,因为我的自定义表格的设计和进度都需要在同一个线程中运行。

    @Override
    public void onClick(final View v) {
    
        switch (v.getId()) {
        case R.id.btn_spreadSheetAddRow: {
    
    
            Toast.makeText(this,
                    "Loading",
                    Toast.LENGTH_SHORT).show();
    
            final Thread uiThread = new Thread(new Runnable() {
    
                @Override
                public void run() {
    
                    uiHandler.postDelayed(new Runnable() {
    
                        @Override
                        public void run() {
    
                            //Call the heavy table design code;
    
                            Toast.makeText(getApplicationContext(),
                                    "Done",
                                    Toast.LENGTH_SHORT).show();
    
                        }
                    }, 80);
                }
            });
            uiThread.start();
        }
            break;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多