Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动画中的线程问题_Java_Android_Multithreading_Animation - Fatal编程技术网

Java 动画中的线程问题

Java 动画中的线程问题,java,android,multithreading,animation,Java,Android,Multithreading,Animation,所以,我知道在UI线程上睡觉是不好的做法。不过我这里有个问题,我不知道该怎么解决。我有一个在UI线程内部执行的循环。其中一个方法(placeTile())具有与之关联的动画。因为这是一个循环,所以我需要暂停代码执行,以便为动画的完成留出时间,并允许用户查看刚刚发生的事情。(例如,像交易或抽牌。他们应该看到每个牌一次放置一个,这样他们就可以跟随棋盘游戏的流程。) 但是,既然Android API必须在UI线程上运行(这意味着动画不能在工作线程上运行),我该如何实现这一点呢?如果我暂停UI线程,动画

所以,我知道在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
    }
}
public void setUpPlayers(){
//设置轮次的吐司
smallToast(getResources().getString(R.string.Demining_turn_order));
for(int i=0;i
我知道在UI线程上睡觉是不好的做法

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();
正确,这是一种非常糟糕的做法,你应该尽量避免。通过运行一个
线程
,处理您应该在主UI中运行的内容,然后通过声明一个
处理程序
来更新主UI,您可以轻松实现这一点

步骤是,在主UI中声明
处理程序
,在类中的
线程
循环中访问
处理程序
,并且每当需要更新主
UI
中的内容时,只需向UI
线程
发送
消息

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();

由于跨多个类的范围问题,我无法使您的方法工作。这确实让我走上了正确的道路。最后,我在
for循环
中使用
I
来计算通过在新线程中运行循环内部的所有内容来增加post延迟的秒数。这样,对于已经发生的每个前一次迭代,每个迭代都会额外等待2秒。