SHORT概要Androidのない同期
forループと遅延が、私は活動のゲームを持っています。ユーザーは、画像をクリックします。
ユーザーがクリックすると、正しいものを選択するために5秒を持っています。 5秒後、正しい画像ビューが注意を引くために異なって表示され、5秒後に再び次のレベルが表示されます。
ユーザーは5秒間待たずにクリックできるので、クリックするとすぐに次のレベルに移動する必要があります。
私は動的にビューとイメージビューを作成しています。 Imageviewsはローカルデータベースsqliteからバイトとして送られています。
私のメソッドは、oncreateメソッドの中に作成しています。私はforループとwhileループを使用します。各反復はゲームのレベルです。各レベルには、イメージビューとイメージビューの数が異なります。
5 + 5秒の遅延のために、私はハンドラ、スレッド、countdowntimersを使用しなければなりませんでした。それぞれが問題を引き起こしました。
ハンドラを使用しているときに、ユーザーが5秒前にクリックしたときに、現在のセッションを終了できませんでした。
これが正しいかどうかわかりません。
あなたは下の私のコードを見ることができます:LONG説明とCODES
タイマー:
nCreate() {
for (int i = 0; i < 2; i++) {
handler.postDelayed(new Runnable() {
public void run() {
imageAnswer.setImageBitmap(bmp);
imageAnswer.setId(R.id.imgAnswer);
//adding image to screen
finalRLayout.removeAllViews();
finalRLayout.addView(imageAnswer, rLayParams);
//starting timer, if no answer in 5 seconds, run again timer
startTimer();
//clicklisterner
imageAnswer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//if clicks true, cancel timer and go to next iteration of for loop
if (view == findViewById(R.id.imgAnswer)) {
Log.d(TAG, "clicked");
//PUT IN CODE HERE TO GET NEXT IMAGE
cancelTimer();
} else { //if not true, run again timer for last chance
Log.d(TAG, "nonclick");
cancelTimer();
startTimer();
}
}
});
}
}, 2000 * i);
} //for end
} //oncreate end
//start timer function
void startTimer() {
cTimer = new CountDownTimer(5000, 1000) {
public void onTick(long millisUntilFinished) {
Log.d(TAG, "ontick");
}
public void onFinish() {
Log.d(TAG, "timer onfinish");
}
};
cTimer.start();
}
//cancel timer
void cancelTimer() {
Log.d(TAG, "canceltimer");
if (cTimer != null)
cTimer.cancel();
}
3異なるスレッド操作をしかし、うまくいきませんでした。そのうちの1人が画面を黒い画面にしました。他の2人はループの進行を阻止しなかった。あなたがゲームを実装するために、より専門的なものを使用する必要があり、ゲーム開発のために
runnable version
for (int i = 0; i< 20 ; i++) {
Log.d(TAG, "for i2="+ i);
final int finalI = i;
final RelativeLayout finalRLayout = rLayout;
final Runnable r=new Runnable() {
@Override
public void run() {
Log.d(TAG, "for finali2="+ finalI);
TrainingObject trainingObject = new TrainingObject();
trainingObject = trainingObjectList.get(finalI);
objectCount = 2;
//test icin
Log.d(TAG,"testicin trainingobjectid: "+trainingObject.getTrainingobjectID());
object = dbHandler.getObjectObject(trainingObject.getTrainingobjectAnswer());
RelativeLayout.LayoutParams rLayParams = new RelativeLayout.LayoutParams(140,140);
rLayParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
rLayParams.addRule(RelativeLayout.CENTER_IN_PARENT);
imgBytes = object.getObjectImageBlob();
bmp = BitmapFactory.decodeByteArray(imgBytes, 0, imgBytes.length);
imageAnswer.setImageBitmap(bmp);
imageAnswer.setTag(trainingObject.getTrainingobjectAnswer());
imageAnswer.setId(R.id.imgAnswer);
finalRLayout.removeAllViews();
finalRLayout.addView(imageAnswer,rLayParams);
}
};
Log.d(TAG, "3000i2 sonrasi");
handler.postDelayed(r, 6000 * i);
imageAnswer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (view == findViewById(R.id.imgAnswer)) {
Log.d(TAG, "clicked");handler.removeCallbacks(r); handler.postDelayed(r, 0);
//PUT IN CODE HERE TO GET NEXT IMAGE
}
else{
Log.d(TAG, "nonclick");
handler.removeCallbacks(r); handler.postDelayed(r, 6000);
}
}
});
}//for end
この質問をボトムアップで読むことになっていますか? – fiipi
これは問題ではありません。 – Simas
あなたは[AlarmManager](https://developer.android.com/reference/android/app/AlarmManager.html)を使ってみましたか –