【问题标题】:How to display a loading screen while doing heavy computing in Android?如何在 Android 中进行繁重计算时显示加载屏幕?
【发布时间】:2016-02-01 22:01:30
【问题描述】:

我正在开发一个程序,该程序会在用户电话中搜索某个日期,这大约需要 2-3 秒。当它在计算时,我想显示一个加载屏幕,这样用户就知道确实发生了一些事情。但是,当我尝试在计算之前显示加载屏幕时,屏幕上没有显示任何内容。

这就是我所拥有的:

        ProgressDialog loading= new ProgressDialog(this);
        loading.setTitle("Loading");
        loading.setMessage("Please wait...");
        loading.show();

       //search stuff
        loading.dismiss();

除此之外,我还尝试将 ProgressDialog 放入如下线程中,

new Thread(new Runnable(){
            public void run(){
              ProgressDialog loading= new ProgressDialog(this);//error here for "this"
              loading.setTitle("Loading");
              loading.setMessage("Please wait...");
              loading.show();
            }
        });
//search stuff

但由于“this”关键字而失败,我相信是因为它指的是 Activity 而不是常规类,但我可能是错的......

如何让 ProgressDialog 正确显示?

【问题讨论】:

  • 您为什么要创建一个新线程来实际显示加载栏,而不是创建一个新线程来执行您所说的繁重处理......并使用 UI 线程(您当前的线程)来显示进度条等...
  • 如果您在不同的线程中进行搜索,那么在该线程本身的最后调用loading.dismiss()

标签: android multithreading progressdialog android-progressbar


【解决方案1】:

对繁重的任务使用异步任务。将进度对话框代码放在 onPreExecute 方法中,进度对话框关闭代码放在 onPostExecute 方法中,将所有繁重的任务放在 doInBackground 方法中。

【讨论】:

    【解决方案2】:

    尝试使用进度条在新课程中传递上下文(这将在您的主要活动中进行)

    NAME_OF_YOUR_CLASS context = new NAME_OF_YOUR_CLASS(getApplicationContext());
    

    然后在你的课堂上调用这样的方法..(继续课堂)

     public Networking(Context c) {
            this.context= c;
        }
    

    不要忘记将上下文设为字段(私有最终上下文上下文;)

    希望对你有帮助

    如果这可行,也可以尝试扩展 AsyncTask 并使用方法在那里运行您的进度条。

    【讨论】:

    • 他的解决方案中已经有很大的问题了!发送上下文很容易,但你真的认为在 android 的新线程上显示加载就可以了吗?
    【解决方案3】:

    尽量这样处理

    mProgressDialog = ProgressDialog.show(this, "Please wait","Long operation starts...", true);
            new Thread() {
                @Override
                public void run() {
    
                   //Do long operation stuff here search stuff
    
                    try {
    
                        // code runs in a thread
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                mProgressDialog.dismiss();
                            }
                        });
                    } catch (final Exception ex) {
    
                    }
                }
            }.start();
    

    【讨论】:

    • 非常感谢,我几乎可以使用你给我的东西,但是我怎样才能更新那个线程中的全局值?我不断收到一个错误,指出它需要是最终的,但是当我将它设置为最终时,我收到另一个错误,因为我唯一一次设置该值是在线程内。
    • @swagantiswag 使它成为一个类变量,它会工作。
    • 谢谢,如果它是一个类变量而不仅仅是一个函数变量,你介意告诉我为什么它可以工作吗?
    • 我使用了一个可运行对象而不是线程,然后在最后使用了 .run() 而不是 .start()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    相关资源
    最近更新 更多