私はAndroid SDKを初めて使用するので、私に厳しくしないでください。atm 私は最初の Android アプリを使用しています。ほぼ完了していますが、現在少し問題に直面しています。
このアプリは、4 人のプレーヤー (3 人のコンピューターの敵) が参加する小さなシングル プレーヤー カードプレイ ゲームです。
問題は、私が動きをした後..コンピューターの敵がkiロジックに基づいて動きを行っていることです..それはうまく機能しています..しかし、メソッドの終了後にプレイヤー4の最後の動きだけが表示されます. 各ki moveの後にメソッド手順を遅らせても..現在のki moveを表示するためにImageViewsを更新しません...
私は本当にかなり迷っています..論理的な間違いを見つけることができないので..どんな種類の助けにも感謝します..読むためのthx-英語のネイティブスピーカーではありません:-)
さて、ここにいくつかのコードがあります.. 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ドキュメントを読んでも、私の問題の本当の解決策は見つかりませんでした。
私がやりたかったことは: SORT() の後にメイン 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は私にスレッディング、痛みのないスレッディング、非同期タスクを提供します..すごいありがとう!
- プロシージャの負荷は高くありません...データベース操作などはありません。
- thread.join を使用すると ... メインの UI スレッドがまだロックされている
まず第一に..スレッドを使用する論理的な理由がわかりません..しかし、私はちょっとしなければなりませんか?さて、ここに行きます..コードを次のように変更するとしましょう:
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 は最も簡単な方法の 1 つです.. 移動をパスするとどうなりますか.. CPU プレーヤーがループに入ってそれを終了するとどうなりますか.. このループでメイン UI に階層的にアクセスすることはできません.. だから私は再びそこにいます.
わかりません..ロジックを実装するのに2週間ほどかかりました..このゲームのルールはかなり特殊なので..そして今では意図したとおりに実行されているため、kiはスマートです..UIロックの原因で失敗しますUP ..これは恥ずかしい..