Yanıtlar:
Her zaman olduğu gibi, Android'de bunu yapmanın pek çok yolu vardır, ancak aynı iş parçacığı üzerinde biraz daha sonra bir kod parçası çalıştırmak istediğinizi varsayarsak, şunu kullanıyorum:
new android.os.Handler().postDelayed(
new Runnable() {
public void run() {
Log.i("tag", "This'll run 300 milliseconds later");
}
},
300);
.. bu hemen hemen eşdeğerdir
setTimeout(
function() {
console.log("This will run 300 milliseconds later");
},
300);
MyActivityName.this.myFunctionOnActivity()
Handler timeout = new Handler(); final Runnable r = new Runnable{...}; timeout.postDelayed(r, 300);
ve iptal etmek isterseniz:timeout.removeCallbacks(r);
setInterval ()
her n milisaniyede kendini tekrar eden işlev
JavaScript
setInterval(function(){ Console.log("A Kiss every 5 seconds"); }, 5000);
Yaklaşık java Eşdeğeri
new Timer().scheduleAtFixedRate(new TimerTask(){
@Override
public void run(){
Log.i("tag", "A Kiss every 5 seconds");
}
},0,5000);
setTimeout ()
yalnızca n milisaniyeden sonra çalışan işlev
JavaScript
setTimeout(function(){ Console.log("A Kiss after 5 seconds"); },5000);
Yaklaşık java Eşdeğeri
new android.os.Handler().postDelayed(
new Runnable() {
public void run() {
Log.i("tag","A Kiss after 5 seconds");
}
}, 5000);
scheduleAtFixedRate
bu etkinlik bittikten sonra yöntemle, nasıl etkinliği içinde zamanlayıcı iptal edebilirim?
Telefonunuzu uyandırmaktan veya uygulamanızı ölümden geri getirmek konusunda endişelenmiyorsanız şunları deneyin:
// Param is optional, to run task on UI thread.
Handler handler = new Handler(Looper.getMainLooper());
Runnable runnable = new Runnable() {
@Override
public void run() {
// Do the task...
handler.postDelayed(this, milliseconds) // Optional, to repeat the task.
}
};
handler.postDelayed(runnable, milliseconds);
// Stop a repeating task like this.
handler.removeCallbacks(runnable);
Gerçekte ne elde etmek istediğinize bağlı olarak, Android İşleyicilere bir göz atmalısınız:
http://developer.android.com/reference/android/os/Handler.html
Daha önce javascript setTimeout () vb. Kullandıysanız, ileride çalışacak bir görevi zamanlamak için, Android bunu yapmanın yoludur (postDelayed / sendMessageDelayed).
Ne İşleyicilerin ne de Zamanlayıcıların bir Android telefonu uyku modundan uyandırmadığını unutmayın. Diğer bir deyişle, ekran kapalıyken / cpu uyurken bir şeyi gerçekten olacak şekilde programlamak istiyorsanız, AlarmManager'ı da kontrol etmeniz gerekir.
JavaScript hakkında pek bir şey bilmiyorum ama bence aradığınız şey Zamanlayıcılar olabilir.
http://developer.android.com/reference/java/util/Timer.html
Bağlantıdan:
Tek atış, mutlak bir zamanda veya göreceli bir gecikmeden sonra çalışacak şekilde planlanmıştır. Yinelenen görevler, sabit bir süre veya sabit bir oranla planlanır.
İlk cevap kesinlikle doğru cevap ve bu lambda versiyonunu temel aldığım şey bu, sözdiziminde çok daha kısa. Runnable'ın yalnızca 1 geçersiz kılma yöntemi "run ()" olduğundan, bir lambda kullanabiliriz:
this.m_someBoolFlag = false;
new android.os.Handler().postDelayed(() -> this.m_someBoolFlag = true, 300);
import java.util.Timer;
import java.util.TimerTask;
class Clock {
private Timer mTimer = new Timer();
private int mSecondsPassed = 0;
private TimerTask mTask = new TimerTask() {
@Override
public void run() {
mSecondsPassed++;
System.out.println("Seconds passed: " + mSecondsPassed);
}
};
private void start() {
mTimer.scheduleAtFixedRate(mTask, 1000, 1000);
}
public static void main(String[] args) {
Clock c = new Clock();
c.start();
}
}
İşte bir setTimeout eşdeğeri, çoğunlukla bir gecikmeden sonra Kullanıcı Arayüzünü güncellemeye çalışırken yararlıdır.
Bildiğiniz gibi, kullanıcı arayüzünü güncellemek yalnızca UI iş parçacığından yapılabilir. AsyncTask, bu iş parçacığından onPostExecute yöntemini çağırarak bunu sizin için yapar.
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
return null;
}
@Override
protected void onPostExecute(Void result) {
// Update the User Interface
}
}.execute();
onProgressUpdate()
simülasyon için de kullanılabilir setInterval()
. 2. AsyncTask
bir iş parçacığı havuzunda (veya yalnızca tek bir iş parçacığında) çalışır, bu nedenle a. başka birinin AsyncTask
bitmesini beklemek zorunda kalabilir ; b . havuzdan bir iş parçacığı alacaktır.
Android için bir mp3 çalar oluşturuyordum, her 500 ms'de bir güncel saati güncellemek istedim bu yüzden böyle yaptım
private void update() {
new android.os.Handler().postDelayed(new Runnable() {
@Override
public void run() {
long cur = player.getCurrentPosition();
long dur = player.getDuration();
currentTime = millisecondsToTime(cur);
currentTimeView.setText(currentTime);
if (cur < dur) {
updatePlayer();
}
// update seekbar
seekBar.setProgress( (int) Math.round((float)cur / (float)dur * 100f));
}
}, 500);
}
aynı yöntemi yinelemeli olarak çağıran
Kotlin:
CountDownTimer'ı da kullanabilirsiniz:
class Timer {
companion object {
@JvmStatic
fun call(ms: Long, f: () -> Unit) {
object : CountDownTimer(ms,ms){
override fun onFinish() { f() }
override fun onTick(millisUntilFinished: Long) {}
}.start()
}
}
}
Ve kodunuzda:
Timer.call(5000) { /*Whatever you want to execute after 5000 ms*/ }