【问题标题】:How to show Progress Dialog on UI?如何在 UI 上显示进度对话框?
【发布时间】:2013-11-25 01:23:39
【问题描述】:

我有一个需要很长时间才能运行的任务。所以,我想实现一个进度对话框,旋转轮,向用户显示任务仍在后台运行的消息。我在网上找到了很多解决方案,我使用了以下代码。我确保在单独的线程中运行任务。但它没有显示在 UI 上。

OnClickListener confirmPrintButtonListener = new OnClickListener() {

    public void onClick(View v) {
        try {
            final SalesStockController salesStockController = new SalesStockController();
            final ArrayList<ProductReload> productReloadList = reloadActivityAdapter
                    .getReloadList();

            if (productReloadList.size() != 0) {                    
                progressDialog = new ProgressDialog(StockReloadActivity.this);
                progressDialog.setTitle("ABC Trading");
                progressDialog.setMessage("Wait while loading...");
                progressDialog.show();

                new Thread(new Runnable() {
                      public void run()
                      {
                        // do the thing that takes a long time
                          try {
                            salesStockController.reload(productReloadList);
                        } catch (SQLiteException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (FileNotFoundException e) { 
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (ABCException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } 

                          runOnUiThread(new Runnable() {
                          public void run()
                          {
                              progressDialog.dismiss();
                          }
                        });
                      }
                    }).start();

                AlertDialog.Builder builder = new AlertDialog.Builder(
                        v.getContext());
                builder.setCancelable(false).setPositiveButton("OK",
                        new DialogInterface.OnClickListener() {

                            public void onClick(DialogInterface dialog,
                                    int which) {
                                finish();
                            }
                        });

                AlertDialog alert = builder.create();

                alert.setTitle("ABC  Trading");
                alert.setMessage("Reload Successfully");

                alert.show();

                    ReloadSlipPrint print = new ReloadSlipPrint(
                            productReloadList);
                    print.print();

            } else {
                AlertDialog.Builder builder = new AlertDialog.Builder(
                        v.getContext());
                builder.setCancelable(false).setPositiveButton("OK", null);
                AlertDialog alert = builder.create();

                alert.setTitle("ABC Trading");
                alert.setMessage("No Stock To Reload");

                alert.show();
            }

        } catch (Exception e) {
            ABCUtil.displayErrorMsg(v.getContext(), e);
        }
    }
};

有人可以指出我的代码有什么问题吗?任何帮助将不胜感激。

【问题讨论】:

    标签: java android android-asynctask progressdialog progress


    【解决方案1】:

    只是给你做了一个简单的例子,你可以试试。

    public class MainActivity extends Activity {
    
        private ProgressDialog mLoadingDialog;
        private Handler mHandler = new Handler();
        private void showLoadingDialog(final String title, final String msg) {
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    if(mLoadingDialog == null) {
                        mLoadingDialog = ProgressDialog.show(MainActivity.this, title, msg);
                    }
                    mLoadingDialog.setTitle(title);
                    mLoadingDialog.setMessage(msg);
                }
            });
        }
    
    private void hideLoadingDialog() {
        mHandler.post(new Runnable() { //Make sure it happens in sequence after showLoadingDialog
            @Override
            public void run() {
                if(mLoadingDialog != null) {
                    mLoadingDialog.dismiss();
                }
            }
        });
    }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            new Thread() {
                @Override
                public void run() {
                    showLoadingDialog("Loading", "Please wait...");
                    //DO something
                    hideLoadingDialog();
                }
            }.start();
        }
    }
    

    【讨论】:

    • 任务在按钮 OnclickListener 块内,如何调用以显示消息?
    • 在你的onClick()方法中,调用showLoadingDialog();如果任务线程是在onclick方法中创建的,则调用线程中显示的加载
    • 嗨罗宾,感谢您的宝贵时间。我更新了我的问题。请查看更新会话。在我使用您的代码后,它会在过程完成后显示。即使任务完成了它的工作,它也没有解散并仍在运行。你能指出我哪里做错了吗?
    • 我调试了我的程序,您的代码运行良好。我不知道为什么它在完成任务后显示。
    • 我刚刚测试了我的演示代码,它运行得很好。所以必须确保 salesStockController.reload(productReloadList);正确返回。更重要的是,如果 salesStockController.reload(productReloadList);返回太快,那么可能会在显示加载之前调用 hideLoading。我会稍微修改一下我的答案。退房。
    【解决方案2】:

    您可以使用 AsyncTask 类来执行长时间运行的任务

    下面是相同的api链接

    http://developer.android.com/reference/android/os/AsyncTask.html

    【讨论】:

      猜你喜欢
      • 2017-11-16
      • 2016-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      相关资源
      最近更新 更多