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