所以大家好,這是我的第一篇文章中的計算器, 和我在1個問題得到stucked,延遲在for循環中,使麪包每2秒
的問題是: 哪能裏面添加一個延遲for循環
我做了很多研究,但都沒有工作 所以我決定問自己。
這裏是我的代碼
Handler handler1 = new Handler();
for (langId = 1; langId <= 3; langId++) {
handler1.postDelayed(new Runnable() {
@Override
public void run() {
if (langId == 1) {
Toast.makeText(KCRdestActivity.this, "1", Toast.LENGTH_LONG).show();
delayTime += 2000;
}
if (langId == 2) {
Toast.makeText(KCRdestActivity.this, "2", Toast.LENGTH_LONG).show();
delayTime += 2000;
}
if (langId == 3) {
Toast.makeText(KCRdestActivity.this, "3", Toast.LENGTH_LONG).show();
delayTime += 2000;
}
}
}, delayTime);
}
所以結果我想要的是:
"1" -> 2000ms -> "2" -> 2000ms -> "3"
任何想法?
我試過Thread.sleep(2000)
,它工作,但它凍結了應用程序,我需要在該過程中做額外的事情。
編輯
問題解決了,這是工作的代碼,也是我的最終目標
playBtn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final Handler handler1 = new Handler();
langId = 1;
max = 1;
delayTime = 0;
selectedMP = 1;
if (((RadioButton) findViewById(R.id.noneDepart)).isChecked()) max = 3;
else max = 6;
handler1.post(new Runnable() {
@Override
public void run() {
if (((RadioButton) findViewById(R.id.noneDepart)).isChecked()) {
String destdir = "KCR/Depart/" + Utils.getDestID(selectedDest) + "_";
if (viaRAC.isChecked()) destdir = destdir + "via_rac_";
destdir = destdir + langId + ".mp3";
if (selectedMP == 1) {
try {
afd = getAssets().openFd(destdir);
mp1.reset();
mp1.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
mp1.prepare();
mp1.start();
//Utils.RunOnUiThread(KCRdestActivity.this, mp1, sb1);
((Button) findViewById(R.id.Play1)).setText("❙❙");
selectedMP = 2;
delayTime = mp1.getDuration() - 130;
Toast.makeText(KCRdestActivity.this, delayTime + "##" + destdir, Toast.LENGTH_LONG).show();
} catch (Exception e) {
e.printStackTrace();
}
} else {
try {
afd = getAssets().openFd(destdir);
mp2.reset();
mp2.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
mp2.prepare();
mp2.start();
//Utils.RunOnUiThread(KCRdestActivity.this, mp1, sb1);
((Button) findViewById(R.id.Play1)).setText("❙❙");
selectedMP = 1;
delayTime = mp2.getDuration() - 130;
Toast.makeText(KCRdestActivity.this, delayTime + "##" + destdir, Toast.LENGTH_LONG).show();
} catch (Exception e) {
e.printStackTrace();
}
}
}
if (langId > 3) {
return;
}
langId++;
handler1.postDelayed(this, delayTime);
}
});
}
});
你能描述一下你爲什麼要原因要做到這一點 ? –
postDelayed意味着運行中的代碼塊將在延遲時間後觸發。這意味着延遲時間值在運行函數被調用之前已經被引用。 – tompee
此外,與postDelayed形成鮮明對比的是,循環同步執行。因此,在第一次運行被調用之前,循環有很高的完成執行的可能性,這意味着延遲總是相同的。 – tompee