线程问题与动画

时间:2014-03-24 17:57:13

标签: java android multithreading animation

所以,我知道睡眠UI线程是不好的做法。我在这里遇到了一个问题,我很困惑如何绕过它。我有一个在UI线程内部执行的循环。其中一个方法(placeTile())有一个与之关联的动画。因为它是一个循环,我需要暂停代码执行以给动画完成时间,并允许用户查看刚刚发生的事情。 (例如,像处理或绘制卡片一样。他们应该看到每个瓷砖一次放置一个,以便他们可以跟随棋盘游戏的流程。) 但是,由于Android API必须在UI线程上运行,(意味着动画不能在工作线程上发生),我该如何实现呢?如果我暂停UI线程,动画将无法运行,对吧?但我无法在工作线程上运行动画。由于for循环包含动画,这是否意味着我无法暂停循环并允许动画完成?

如果我错过了一些显而易见的东西,我仍然很擅长线程,请原谅我。

以下是代码:

public void setUpPlayers(){

    //Toast for setting turn order
    smallToast(getResources().getString(R.string.deciding_turn_order));

    for (int i = 0; i < players.length; i++) {
        if(i == 0){
            players[i] = new Player("HUMAN", 6000);
            players[i].setType(Player.Type.HUMAN);
        } else {
            players[i] = new Player(playerNames[i], 6000);
            players[i].setType(Player.Type.COMPUTER);
        }           
        players[i].drawTile(1);

        TextView nameText = (TextView) findViewById(R.id.current_player_text);
        nameText.setText(players[i].getName());

        //find the ID for the tile just placed
        String tileID = players[i].findTileIdByIndex(0);

        placeTile(tileID, i); //Tile ID being placed, and the index of the player placing it

        //TODO: Pause and wait for animation to complete
    }
}

1 个答案:

答案 0 :(得分:0)

I know it's bad practice to ever sleep the UI thread

正确,这是一种非常糟糕的做法,你应该尽可能避免它。您可以通过运行Thread来处理您在主UI中运行的内容,然后通过声明Handler来更新主UI,从而轻松实现这一目标。

步骤是,您在主用户界面中声明了Handler,您可以在班级内的Handler循环内访问Thread,并且无论何时需要更新主要内容UI,只需将Message发送到用户界面Thread

static class MyHandler extends Handler {
  @Override
  synchronized public void handleMessage(final Message msg) {
    final String myMessage = msg.toString();
    // Do whatever you need to do...
    ...
  }
}

final MyHandler handler = new MyHandler();

final Thread lowp = new Thread(
  new Runnable() { 
    public void run() { 
      // Do whatever you need to do
      ...

      // And call this when you have to do something in the main UI
      final Message mess = new Message();
      mess.obj = "Update the UI!";
      handler.sendMessage(mess);
    }
  });

myLoop.start();