2016-12-16 10 views
0

私はメモリゲームアプリを作成しました。レイアウトの各imageButtonのonClick属性に挿入した "OnImageButtonClick"という関数があります。 イメージをクリックするとイメージを変更するはずですが、実際に何が起こるかは、関数が終了した後でイメージが実際に変更されることです。imageButtonのAndroid setImageResource

public void onImageButtonClick(View v) throws InterruptedException { 
    int cardIndex = Integer.parseInt(v.getTag().toString()); 
    ImageButton card = (ImageButton)v; 
    Resources resources = this.getResources(); 
    int imageId = resources.getIdentifier(imageArr[cardIndex-1], "drawable", this.getPackageName()); 
    card.setImageResource(imageId); 


    if(isFirst) { 
     pickedCards[0] = card; 
    } 
    else { 
     pickedCards[1] = card; 
    } 

    PickCard(); 
} 

public void PickCard() throws InterruptedException{ 
    try { 
     Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
      Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification); 
      r.play(); 
     } catch (Exception e) { 
      Toast.makeText(this, "Can't play music", Toast.LENGTH_LONG); 
     } 

     if(!isFirst) { 
      if (pickedCards[0].getBackground() == pickedCards[1].getBackground()){ 
       Points++; 
      } 
      else { 
       Thread.sleep(1000); 
       pickedCards[0].setImageResource(R.drawable.card); 
       pickedCards[1].setImageResource(R.drawable.card); 
      } 
     } 

     isFirst = !isFirst; 
    } 

問題は画像が実際に変更される前にPickCardが発生することです。

+0

は、タスクを使用して重いメモリa'like聞こえます。 PickCard()は何をしますか? – Opiatefuchs

+0

私の編集を見て@Opiatefuchs –

+0

これは私が言ったものの例です:http://stackoverflow.com/a/15709457 –

答えて

0

、これを試しては少し複雑であるが、動作してもよい:

はAsynctaskを作成し、第一の方法(画像リソースを変更する)及び方法はPickCard()を呼び出すonPostExecute第一の方法は、次に実行された後に実行します。ここで

はこれを行う方法にいくつかのドキュメントです: https://developer.android.com/reference/android/os/AsyncTask.html


public class ImgBtnClick extends AsyncTask<ImageButton, Void, Void> { 


public ImgBtnClick (Context contexts) { 
    context = contexts; 
} 


@Override 
protected void onPreExecute() { 
    //Insert Here the code to change the Image resource 
    /* 
int cardIndex = Integer.parseInt(v.getTag().toString()); 
ImageButton card = (ImageButton)v; 
Resources resources = this.getResources(); 
int imageId = resources.getIdentifier(imageArr[cardIndex-1], "drawable", this.getPackageName()); 
card.setImageResource(imageId); 


if(isFirst) { 
    pickedCards[0] = card; 
} 
else { 
    pickedCards[1] = card; 
} 
    */ 
} 

@Override 
protected void onPostExecute(String[] result) { 
    PickCard() 
    } 

} 
+0

しかし、なぜこのために非同期が必要でしょうか?それは困難である必要はありません –

+0

これはあなたの問題を安全に解決できるので、あなたが必要とするものを行います:) 私はこれがあなたの問題を解決したことを願っています:D –

関連する問題