2017-08-10 79 views
0

以下情況:等待2個點擊事件,直到繼續不起作用

我編寫了一個適用於Android的Domino遊戲。在比賽開始時,如果不是機器人是首發球員,那麼用戶應該挑選兩塊進入棋盤的多米諾骨牌。

概述我不工作的做法:

一個空的ArrayList的定義,即重視對每一個多米諾點擊監聽器函數的調用屬於用戶後跟一個while循環,什麼也不做,應該只是在機制等待,直到用戶選擇了兩個多米諾骨牌。這些多米諾骨牌應存儲在該ArrayList(添加骨牌在FirstDominosPickerListener該ArrayList)

代碼

在活動:

ArrayList<Domino> starterDominos = new ArrayList<Domino>(); 

    startingPlayer.chooseStartDominos(starterDominos); 

功能:

public void chooseStartDominos(ArrayList<Domino> starterDominos){ 


     ///Every Domino gets a ClickListener 
     for (Domino domino : playerSet){ 
      domino.setOnClickListener(new FirstDominosPickerListener(starterDominos)); 
     } 

     //The idea is to wait until the user has picked two Dominos. With that loop, no UI at all shows up 
     while (starterDominos.size()<2){ 

      Log.v(LOG_TAG," WAIT!!!!"); 
     }   


    } 

問題是while循環。隨着循環,沒有UI顯示,我得到一個空的白色屏幕,儘管代碼運行。在logcat中,我得到無限的「等待」消息。不知道爲什麼。

我已經嘗試了第二種方法是調用一個定時器任務在活動中,檢查後如果兩個多米諾骨牌被挑選(通過列表的大小)starterDominos = startingPlayer.chooseStartDominos(starterDominos);

我意識到,不能因爲工作在另一個線程中運行,因此無法訪問UI的任何部分。但選擇多米諾骨牌的機制奏效了。 UI出現了,run()結束後二骨牌是通過cancel()採摘。

那麼,爲什麼while循環導致這種行爲?是整個方法錯了,如果是這樣我能做些什麼,該應用程序等待,直到骨牌挑選,然後進行

+0

我可能會建議您通過幾個安卓教程工作,你在潛水前,不要吝嗇過於關鍵,但你的代碼顯示了有關應用程序的Android是如何工作的一個非常基本的知識的缺乏。 – JJF

+0

我已經完成了教程。你能更具體嗎? – Reinmarius

+0

你應該明白*爲什麼* RE主線程被阻止的答案是正確的。你知道主線程是什麼嗎?你知道爲什麼你不能阻止主線程嗎?你知道這意味着什麼阻止線程嗎?你知道什麼是線程嗎?這些東西。 – JJF

回答

2

while循環阻塞主UI線程所以沒有什麼可以得出或更新在屏幕上。您需要爲用戶選擇多米諾骨牌時設置偵聽器,然後在用戶選擇兩個多米諾骨牌之後繼續。

0

可以使用一個類變量在活動類的userDominoSelectCount'可以是初始化爲0。

短整型字段可以添加onClickListener在活動多米諾onCreate方法本身:

domino.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     ++userDominoSelectCount; 
     if(userDominoSelectCount == 2){ 

     //initiate AI logic 
     userDominoSelectCount = 0; 
     } 
    } 
}); 

你正在做將阻止主線程在其他問題的回答中提到的方法。 OnClicklisteners意味着在事件循環中運行,理想情況下不應該阻止UI。