所以,我知道睡眠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
}
}
答案 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();