【问题标题】:Show ProgressBar for a few seconds in Android在 Android 中显示 ProgressBar 几秒钟
【发布时间】:2014-01-30 20:59:11
【问题描述】:

我必须在我的 Android 应用程序中等待几秒钟,我想在此期间显示一个进度条,我该怎么做?

例如:

@Override
protected void onCreate(Bundle savedInstanceState) {

    timeForShow(5 //second);

}
.
.
.

private void timeForShow(long mytime){

myprogress.setVisibility(View.VISIBLE);   
Waiting for mytime...
myprogress.setVisibility(View.GONE); 

}

这是我的代码,但它不起作用:

Long timerforprogressbar ;

@Override
protected void onCreate(Bundle savedInstanceState) {

    timerforprogressbar = (long) 5000 ;
    new MyProgressBar().execute((Void)null);

}
.

.

.


class MyProgressBar extends AsyncTask<Void, Void, Void>{

    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub
        progressbar.setVisibility(View.VISIBLE);
        try {
            Thread.sleep(timerforprogressbar);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        progressbar.setVisibility(View.GONE);
    }

}

我的进度条:

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone"
        android:indeterminateDrawable="@drawable/progress" >
    </ProgressBar>

progressbar 是我的进度条,请帮帮我,tnx。

【问题讨论】:

  • 我试图给出一个答案,但我想更详细地了解您的问题。你说它不起作用..它做错了什么?进度条是否未显示,或者它的行为与您的预期不同?
  • 我有一个异步任务:paste.ubuntu.com/6846131。它是一个解析xml。现在,我创建了一个函数:paste.ubuntu.com/6846146。我想第二次展示我的进度(自定义时间)。但是看不到我的进步!
  • 首先doInBackground是在后台线程中运行的,不需要有executeThread。其次,正如我在回答中提到的那样,尝试以编程方式创建进度对话框,稍后将对我的回答进行编辑以演示它。
  • 或者,如果您不想要对话框,我怀疑将可见性设置为不可见而不是消失可能会有所帮助。

标签: android progress-bar


【解决方案1】:

对于您的特定用例,使用处理程序会更简单:

new Handler().postDelayed(new Runnable() {

    @Override
    public void run() {
       progressbar.setVisibility(View.GONE);
    }

}, timerforprogressbar);

你没有提到你的进度条是如何构建的,但如果你只是想显示一个不确定的进度,那么我认为以编程方式构建它是最简单的事情。

private ProgressDialog working_dialog;

private void showWorkingDialog() {
    working_dialog = ProgressDialog.show(context, "","Working please wait...", true);
}

private void removeWorkingDialog() {
    if (working_dialog != null) {
        working_dialog.dismiss();
        working_dialog = null;
    }
}

这将使代码看起来像:

showWorkingDialog();

new Handler().postDelayed(new Runnable() {

    @Override
    public void run() {
        removeWorkingDialog();
    }

}, timerforprogressbar);

【讨论】:

    【解决方案2】:

    您可以随时使用CountDownTimer:

    public void timer() {
    
        countDownTimer=new CountDownTimer(20000, 1000) { //display a delay of 20 seconds
    
            public void onTick(long millisUntilFinished) {
    
    
                if (somethingToBreakTheCount)
                    countDownTimer.onFinish();
    
                txtDebug.setText("seconds remaining: " + millisUntilFinished / 1000);
            }
    
            public void onFinish() {
                txtDebug.setText("Done!");
                finish();
            }
        }.start();
    }
    

    【讨论】:

      【解决方案3】:

      // 我们可以通过使用协程来实现。
      // 只需启动一个协程并通过在几毫秒后更改调度程序上下文来更改进度条的进度。
      // 这里我在移动到下一个片段之前显示了 1 秒的进度。

      CoroutineScope(Dispatchers.IO).launch {
                      for (i in 0..100) {
                          delay(10)
                          withContext(Dispatchers.Main) {
                              binding.progressBar.progress = i
                          }
                      }
              //Navigate to next fragment using nav contorller or with Intents for next Activity
              navController.navigate(R.id.action_startFragment_to_listFragment)
      
      }
      

      【讨论】:

      • 这回答了问题,但最初的问题是用 Java 提出的。
      【解决方案4】:

      Updating progress dialog in Activity from AsyncTask

      还有一种异步任务用于进度更新的方法。

      这是一个更好的帖子的链接

      【讨论】:

      • 我的进度是循环进度。
      【解决方案5】:

      作为比 AsyncTask 更简单的解决方案,您始终可以考虑使用 CountDownTimer 来执行此操作。

      【讨论】:

        【解决方案6】:

        如果您在 AsyncTask doInBackground() 中执行任务,那么您可以在 onPreExecute() 中启动您的进度条并在 onPostExecute() 中禁用它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-02-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多