【问题标题】:Show progress Dialog while the UI gets customized自定义 UI 时显示进度对话框
【发布时间】:2012-02-28 04:31:04
【问题描述】:

我已经知道在执行后台操作时如何使用进度对话框。但我的问题是当我动态地膨胀一个巨大的布局时如何显示一个进度对话框。

由于我无法在另一个线程中扩展视图,因此我正在使用主 UI 线程。因此,我的进度对话框没有获得优先权,也没有出现。我的 UI 会挂起几秒钟,直到它完全加载。我尝试了几种方法,但似乎都没有。

        progress.show(context,"","inflating UI...");   
        setNewContent(R.layout.my_profile,R.id.my_profile_menu_button,R.id.my_profile_all_elements_layout);
                populateProfileList(); //Dynamic nested layouts being inflated.

我基本上是在寻找基于用户操作的动态布局更改。因此,除了创建动态视图之外,我没有其他方法。谁能给我一个有用的想法。

【问题讨论】:

  • 能否请您发布 setNewContent 方法

标签: android progressdialog


【解决方案1】:

我在使用 ui-thread 时遇到了类似的问题。我想在运行时向我的布局添加很多视图,我想显示一个 ProgressDialog 来通知用户,这可能需要一段时间。我曾尝试使用 AsyncTask,但唯一的机会是将我的 ui 方法实现到 AsyncTask 的 onPostExecute-Method 中。但这只是冻结了 ProgressDialog,因为 ProgressDialog 甚至可以在 ui-thread 上工作。我找到了一个解决方案,也许不是最好的,但它确实有效。在开始 ui-action 之前,我展示了一个 Toast。然后,我创建了一个带有处理程序的线程并延迟了执行。 ui-action 完成后,我展示了一个新的 Toast。延迟线程,给 Toast 足够的时间来显示:

    Toast.makeText(ActivityContext.this,
                  R.string.start_message,
          Toast.LENGTH_SHORT).show();

    final Handler uiHandler = new Handler();

    final Thread uiThread = new Thread(new Runnable() {

              @Override
           public void run() {

    uiHandler.postDelayed(new Runnable() {

              @Override
          public void run() {

              yourUIAction();

              Toast.makeText(
                  ActivityContext.this,
                  R.string.finish_message,
                  Toast.LENGTH_SHORT).show();                        

                            }
                          }, 100);
                  }
                });
     uiThread.start();

【讨论】:

    【解决方案2】:

    您需要使用处理程序才能与 UI 线程对话

    //in some thread
    uiHandler.sendEmptyMessage(1);
    
    ...
    Handler uiHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                if(msg.what == 1) {
                    //do somestuff
                }
            }
        };
    

    【讨论】:

    • 我知道我可以使用处理程序。而且我已经使用处理程序来更新 UI。但是此时progressDialog只是挂了。它不再旋转,使它看起来更讨厌
    • 所以如果你把你的progressDialog放在一个新线程中并启动它,然后调用处理程序来扩展你的布局不应该这样工作吗?
    • 我试过了,如果我这样尝试,进度轮不转。
    【解决方案3】:

    对我来说,使用异步任务是一个更好的主意,当您必须在后台执行某些操作时,屏幕上会显示进度对话框,然后当后台任务完成时,更新 UI...作为参考,请点击链接...

    http://labs.makemachine.net/2010/05/android-asynctask-example/

    希望这会有所帮助...:-)

    【讨论】:

    • 请仔细阅读问题。我没有做后台操作。我正在使用主 UI 线程来更新 UI。我不能为此使用后台线程。
    • 好吧,你也可以使用同样的想法...在BG中充气UI并在前面显示微调器,当充气功能结束执行时,移除微调器。
    猜你喜欢
    • 2012-01-14
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    相关资源
    最近更新 更多