android使用progressBar的时候,使用子线程修改进度的时候没有效果啊 代码如下 望高手解答 谢谢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android使用progressBar的时候,使用子线程修改进度的时候没有效果啊 代码如下 望高手解答 谢谢相关的知识,希望对你有一定的参考价值。

public class DebugTestActivity extends Activity
private ProgressBar pb;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
pb=(ProgressBar) findViewById(R.id.progressBar1);
System.out.println(pb.getProgress());
new Thread()

@Override
public void run()
System.out.println("zhixingle");
super.run();
pb.setProgress(10);


.start();



有一个很重要的知识点是android不是线程安全的。更新UI只能在主线程中进行,否则会抛出一个错误。你在new了一个子线程来更新progressbar的进度是不可以的,只能通过handler来完成这件事。 参考技术A ProgressBar的值你设置的多少,如果是10的话当然是没有效果的晒

ProgressBar从另一个线程更新

我知道这个问题之前曾被问过100次,但我读到的所有答案对我都没有用。所以,我会试试运气再问一遍。

我有一个SliderBarValueChanged事件上调用一个方法。在这个方法中,我做了一些需要时间的东西,我希望在这个时候用户会看到一个“工作”的ProgressBarIsIndeterminate=true)。

不幸的是,我没有成功使ProgressBar开始工作(在UI中),直到所有方法循环完成。我试过线程,BackgroundWorkerasync任务但没有成功..

我究竟做错了什么?

这是方法:

    private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e){
        WorkingBar.IsIndeterminate = true;      //change the progressBar          
        SqlAThread = new Thread(SqlAStart);     
        SqlAThread.Start();
    }

线程:

    private void SqlAStart()
    {
        ... //do some stuff
    }
答案

Slider_ValueChanged你开始了一个新的步骤来运行耗时的SqlAStart()方法,但SqlAStart立即将工作推回到UI线程(通过Dispatcher.Invoke())。因此,您的UI会挂起,并且在完成工作之前您不会看到任何ProgressBar进度。

SqlAStart,只需要更新进度条的Dispatcher.Invoke()

private void SqlAStart()
{
    ServerThread = new Thread(HttpSrv.listen);
    ServerThread.Start();
    ...

    this.Dispatcher.Invoke((Action)(() => {
        WorkingBar.Value = ...                
    }));

    ....
}
另一答案

使用IProgress<T>这很容易:

private async void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
  if (State.Value > 0)
  {
    var progress = new Progress<int?>(value =>
    {
      WorkingBar.IsIndeterminate = (value == null);
      if (value != null)
        WorkingBar.Value = value.Value;
    });
    await Task.Run(() => doWork(progress));
    Task.Run(SqlAStart);
  }
  ...
}

private void SqlAStart(IProgress<int?> progress)
{
  ServerTask = Task.Run(HttpSrv.listen);
  ...
}

private void doWork(IProgress<int?> progress)
{
  if (progress != null)
    progress.Report(null);
  ...
}

请注意,您(几乎)不应在现代应用程序中使用DispatcherThreadBackgroundWorker

另一答案

我请你在StackOverflow上看看我对Progress Bar update from Background worker stalling问题的答案,而不是输入整个冗长的过程。它演示了如何正确使用BackgroundWorker对象来更新ProgressBar的进度值。

您可能还希望在MSDN上查看BackgroundWorker Class页面以获取更多详细信息。

以上是关于android使用progressBar的时候,使用子线程修改进度的时候没有效果啊 代码如下 望高手解答 谢谢的主要内容,如果未能解决你的问题,请参考以下文章

Android 可滑动的ProgressBar

Android 可滑动的ProgressBar

Android 可滑动的ProgressBar

ProgressBar 基本介绍

Android踩坑日记:自定义水平和圆形ProgressBar样式

Android ProgressBar手动控制开始和停止