我是android sdk的新手,所以请不要对我严厉。 atm我在我的第一个Android应用程序..它几乎完成但我现在面临一个小问题。
该应用程序是一款小型单人游戏,有4名玩家--3名计算机敌人。问题是,在我做了一个动作之后......计算机敌人正在基于ki逻辑做他们的动作..而且工作得很好..但是只有最后一步让我们说玩家4在结束后显示方法即使我在每次ki移动后延迟方法程序..它也不会更新ImageViews以显示当前的ki移动......
我真的很丢失..因为我找不到任何逻辑错误..我感谢任何帮助.. thx阅读 - 不是母语为英语的人sry: - )
好的,这里有一些代码.. cardDeck持有当前的动作
List<Card> cardDeck = new ArrayList<Card>();
List<Card> move = new ArrayList<Card>();
KI player2 = new KI();
but.setText("GO");
but.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View vw) {
if (!move.isEmpty()) {
if (Rules.checkIsPlayableHand(move)) {
sort();
setClickAble();
ki4Moves(vw);
}
sort()看起来很像:
public void sort(){
cardDeck.clear();
cardDeck.addAll(move);
if (cardDeck.size() == 1) {
dkView1 = (ImageView) findViewById(R.id.dkView1);
Card card = cardDeck.get(0);
dkView1.setImageBitmap(card.getBitmap());
} else {
dkView1 = (ImageView) findViewById(R.id.dkView1);
dkView1.setImageBitmap(blank);
}
}
和ki4Moves()看起来很像:
public void ki4Moves(View vw){
player2.think();
List<Card> kiMove = new ArrayList<Card>();
kiMove = player2.getPossibleMove(cardDeck);
if (!kiMove.isEmpty()) {
trash.addAll(kiMove);
move.clear();
move.addAll(kiMove);
sort();
}
// same for the other both ki s
}
编辑:
经过一些研究之后......阅读android文档我没有找到解决我问题的真正解决方案。我想要做的是:在排序之后强制主要UI线程更新()..就像这样:
@Override
public void onClick(View vw) {
if (!move.isEmpty()) {
if (Rules.checkIsPlayableHand(move)) {
sort();
// FORCE MAIN UI THREAD TO UPDATE .. just one line
// let SystemClock.sleep(2000);
setClickAble();
ki4Moves(vw);
}
现在..我不能强制主线程在主线程之外更新或访问它.. ANDROID为我提供了线程,无痛线程,异步任务..哇谢谢你!
所以首先..我没有看到使用线程的任何逻辑原因..但我KINDA必须?好吧,我在这里..让我说我改变我的代码:
Handler h = new Handler();
@Override
public void onClick(View vw) {
if (!move.isEmpty()) {
if (Rules.checkIsPlayableHand(move)) {
Thread t = new Thread(new Runnable){
void run(){
h.post(new Runnable(){
// do some logic here
});
h.post(new Runnable(){
if (cardDeck.size() == 1) {
dkView1 = (ImageView) findViewById(R.id.dkView1);
Card card = cardDeck.get(0);
dkView1.setImageBitmap(card.getBitmap());
} else {
dkView1 = (ImageView) findViewById(R.id.dkView1);
dkView1.setImageBitmap(blank);
}
});
Thread.sleep(2000);
}
});
t.start();
setClickAble();
ki4Moves(vw);
}
所以你们工作正常..但是哦..有这种方法“ki4Moves(vw)”...我不能让它t.join()..因为我说主要的ui线程将是锁定。所以我需要将ki4Moves中的200行包装成线程以及...
而且这是有效的......每次搬家后......主要的ui都会更新。
BUUUT ki4Moves是最简单的方法之一..如果我通过移动怎么样..并且cpu播放器进入循环来完成它...我不能在这个循环中分层访问主要的ui ..所以那里我我又来了。
我不明白..我花了两周的时间来实现逻辑..因为这个游戏的规则非常特别..现在它按预期运行,ki很聪明..它失败的原因UI LOCKS UP ..对此感到羞耻..
答案 0 :(得分:0)
代码看起来很复杂,但是如果我理解的话,在setImageBitmap()之后调用dkView1上的invalidate()可以解决问题。
但这里有一个提示,如果可能的话,尝试使用drawable而不是Bitmap。