主Ui线程在方法过程中不会更新

时间:2013-03-18 10:47:53

标签: java android eclipse user-interface android-imageview

我是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为我提供了线程,无痛线程,异步任务..哇谢谢你!

  1. 程序没有重载......没有数据库操作等。
  2. 如果我使用thread.join ...主要ui线程仍然被锁定
  3. 所以首先..我没有看到使用线程的任何逻辑原因..但我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 ..对此感到羞耻..

1 个答案:

答案 0 :(得分:0)

代码看起来很复杂,但是如果我理解的话,在setImageBitmap()之后调用dkView1上的invalidate()可以解决问题。

但这里有一个提示,如果可能的话,尝试使用drawable而不是Bitmap。