如何用Android的两个并发线程更新视图

时间:2015-08-12 20:05:54

标签: java android multithreading

我有角色和怪物,想要模拟战斗。为此,我创建了两个主题,一个是角色攻击,另一个是怪物攻击。 角色和怪物有不同的攻击速度,所以他们的线程等待"时间会有所不同。我的方法看起来像这样(我总结了方法):

public void attack(){

//Character's attack thread
Thread characterAttackThread = new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            while(character.getHp()>0 && monster.getHp()>0){
                int damage = character.getDamage();
                monster.setHp(monster.getHp() - damage);
                Thread.sleep(character.getSpeed());
            }
            if(character.getHp()<=0){
                updateScreen("Character died"); //shows message to user
            }else{
                updateScreen("Monster died"); //shows message to user
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});

//Monster's attack thread
Thread monsterAttackThread = new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            while(character.getHp()>0 && monster.getHp()>0){
                int damage = character.getDamage();
                monster.setHp(monster.getHp() - damage);
                this.wait(character.getSpeed());
            }
            Thread.sleep(monster.getSpeed());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});

characterAttackThread.start();
monsterAttackThread.start();
}

但是当我到达updateScreen("Message");时,我收到了错误

Only the original thread that created a view hierarchy can touch its views.

我能做些什么才能解决问题?

提前致谢!

1 个答案:

答案 0 :(得分:1)

你不能从除UI线程之外的任何其他线程修改android工具包

此链接将为您提供说明:

http://developer.android.com/guide/components/processes-and-threads.html

您可以执行以下操作之一:

  1. 使用AsyncTask并从onPostUpdate()函数
  2. 更新UI
  3. 在UI线程中编写处理程序,并从线程中将postmessage写入其中
  4. 在您的主题中使用以下代码:

    id: FactoryGirl.create(:opinion)

    public void run(){

    MainActivity.this.runOnUiThread(new Runnable() {
    

    });

  5. 希望这有帮助