Android-使用来自另一个线程的值更新进度条

Android-使用来自另一个线程的值更新进度条,android,multithreading,Android,Multithreading,我有一个生成迷宫的应用程序。在生成迷宫的过程中,我想更新一个进度条。然而,我看不到一个好办法来做到这一点。进度条在一个线程上运行,而迷宫生成在另一个线程上运行。如何让这两个函数来回传递一个简单的int?对不起,如果这是一个糟糕的问题,我是一个初学者在所有这些 protected void incrementProgress() throws InterruptedException { generateMaze(); //Generates the maze by launching a

我有一个生成迷宫的应用程序。在生成迷宫的过程中,我想更新一个进度条。然而,我看不到一个好办法来做到这一点。进度条在一个线程上运行,而迷宫生成在另一个线程上运行。如何让这两个函数来回传递一个简单的int?对不起,如果这是一个糟糕的问题,我是一个初学者在所有这些

protected void incrementProgress() throws InterruptedException {
    generateMaze(); //Generates the maze by launching a new thread
    while(progressBarStatus < 100) {
        progressBarStatus = maze.getIntPercentDone(); //This does not get updated
        Thread.sleep(10);

        progressBarHandler.post(new Runnable() {
            @Override
            public void run() {
                progressBar.setProgress(progressBarStatus);
            }
        });
    }
    if (progressBarStatus >= 100) { //This condition does not get met 
        Thread.sleep(100);
        progressBar.dismiss();
    }
}

/**
 * Dummy maze generation method that has a counter to simulate progress
 * @return
 */
protected void generateMaze() { //Method that builds a maze
    mazeBuilder.build(maze, Constants.SKILL_X[0], Constants.SKILL_Y[0], Constants.SKILL_ROOMS[0], Constants.SKILL_PARTCT[0]);
    try {
        mazeBuilder.buildThread.join();
    }
    catch (InterruptedException e) {
        mazeBuilder.buildThread.interrupt();
    }
}
protectedvoid incrementProgress()引发InterruptedException{
generateMaze();//通过启动新线程生成迷宫
而(状态<100){
progressBarStatus=maze.getIntPercentDone();//这不会得到更新
睡眠(10);
progressBarHandler.post(新的Runnable(){
@凌驾
公开募捐{
progressBar.setProgress(progressBar状态);
}
});
}
如果(progressBarStatus>=100){//,则不满足此条件
睡眠(100);
progressBar.disclose();
}
}
/**
*虚拟迷宫生成方法,具有模拟进度的计数器
*@返回
*/
受保护的void generateMaze(){//方法,用于构建迷宫
mazeBuilder.build(迷宫,常数.SKILL_X[0],常数.SKILL_Y[0],常数.SKILL_房间[0],常数.SKILL_PARTCT[0]);
试一试{
mazeBuilder.buildThread.join();
}
捕捉(中断异常e){
mazeBuilder.buildThread.interrupt();
}
}

理想情况下,progressbar应该位于主线程中。迷宫生成可以使用Asyctask完成。Asynctask是在android框架提供的不同线程上执行任务的一种很好的方法,它内置了将更改发布到主线程的方法

您可以了解AsyncTask,以及

首先,一旦创建了一个扩展Asynctask的类,您就可以

  • 在doItInBackground()方法中创建迷宫(长时间运行的任务)
  • 并通过从doItInBackground()方法定期调用publishProgress()来发布迷宫创建的进度, 并传递进度(可能作为整型值表示) 完成百分比)
  • publishProgress()实际上将值传递给onProgressUpdate()方法。通过此方法,您可以发布收到的进度更新 到主线程
  • 现在,使用更新的整数进度值更新主线程中的进度对话框

  • 我看了一些例子,但我不明白如何将Progress()从mazebuilder发布到activity?更新答案。你也可以阅读另一个例子