Android / Java에서 JavaScript setInterval / setTimeout에 해당하는 것은 무엇입니까?


129

Android에 대해 setInterval / setTimeout에 해당하는 것이 있는지 누구든지 말해 줄 수 있습니까? 아무도 그것을 수행하는 방법에 대한 예가 있습니까?

답변:


245

Android에서 항상 그렇듯이이 작업을 수행하는 방법은 여러 가지가 있지만 나중에 동일한 스레드에서 코드 조각을 실행하고 싶다고 가정하면 다음을 사용합니다.

new android.os.Handler().postDelayed(
    new Runnable() {
        public void run() {
            Log.i("tag", "This'll run 300 milliseconds later");
        }
    }, 
300);

.. 이것은 거의

setTimeout( 
    function() {
        console.log("This will run 300 milliseconds later");
    },
300);

이것은 서랍 선택과 fragmentTransaction을위한 아주 좋은 솔루션입니다
Gonçalo

6
필요한 경우 어떻게 취소 할 수 있습니까?
Quentin Roy

run () 메서드 내에서 활동 범위를 어떻게 얻습니까?
Andy

@Andy 같은 :MyActivityName.this.myFunctionOnActivity()
벤 클레이튼

1
@QuentinRoy : Handler timeout = new Handler(); final Runnable r = new Runnable{...}; timeout.postDelayed(r, 300);당신은 그것을 취소 할 경우 :timeout.removeCallbacks(r);
바스티안 스프링

101

setInterval ()

n 밀리 초마다 반복되는 함수

자바 스크립트

 setInterval(function(){ Console.log("A Kiss every 5 seconds"); }, 5000);

대략적인 자바 상당

new Timer().scheduleAtFixedRate(new TimerTask(){
    @Override
    public void run(){
       Log.i("tag", "A Kiss every 5 seconds");
    }
},0,5000);

setTimeout ()

n 밀리 초 후에 만 ​​작동하는 함수

자바 스크립트

setTimeout(function(){ Console.log("A Kiss after 5 seconds"); },5000);

대략적인 자바 상당

new android.os.Handler().postDelayed(
    new Runnable() {
        public void run() {
            Log.i("tag","A Kiss after 5 seconds");
        }
}, 5000);

5
를 들어 scheduleAtFixedRate그 활동이 완료되면 방법, 당신은 어떻게 활동 내에서 타이머를 취소합니까?
auroranil 2015

2
@ user824294 Timer 인스턴스를 변수에 저장하고 예약 된 작업을 중지하려면 "cancel ()"을 호출 할 수 있습니다.-Timer t = new Timer (); t.scheduleAtFixedRate (...); -그런 다음 t.cancel (); 당신이 원할 때마다.
Aebsubis

14

휴대 전화를 깨우거나 앱을 죽은 상태에서 되 돌리는 것이 걱정되지 않는다면 다음을 시도해보세요.

// 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);

내 전화 (Huawei P Smart)에서 핸들러가 장치를 절전 모드에서 깨우지 않습니다 ( 다른 답변에서 apanloco가 언급 한대로 )
Franco

13

실제로 달성하고자하는 것에 따라 Android 핸들러를 살펴 봐야합니다.

http://developer.android.com/reference/android/os/Handler.html

이전에 javascript setTimeout () 등을 사용하여 향후 작업을 실행하도록 예약 한 경우 이것이 Android 방식 (postDelayed / sendMessageDelayed)입니다.

핸들러 또는 타이머 모두 Android 휴대 전화를 절전 모드에서 깨우지 않습니다. 즉, 화면이 꺼져 있거나 CPU가 절전 상태 인 경우에도 실제로 일어나도록 예약하려면 AlarmManager도 확인해야합니다.


5

JavaScript에 대해 잘 모르지만 Timers가 당신이 찾고있는 것일 수 있다고 생각합니다.

http://developer.android.com/reference/java/util/Timer.html

링크에서 :

원샷은 절대 시간 또는 상대적 지연 후에 실행되도록 예약됩니다. 반복 작업은 고정 된 기간 또는 고정 된 속도로 예약됩니다.


참고 : 메인 / UI 스레드가 아닌 백그라운드 스레드에서 호출합니다.
Pang

이것은 대답이 아니지만 OP 솔루션을 포함하거나 포함하지 않을 수있는 외부 정보에 대한 참조입니다. OP 사용할 수있는 관련 코드를 붙여 넣으세요!
Lev

5

첫 번째 대답은 확실히 정답이며 구문이 훨씬 더 짧은이 람다 버전을 기반으로 한 것입니다. Runnable에는 "run ()"재정의 메서드가 하나만 있으므로 람다를 사용할 수 있습니다.

this.m_someBoolFlag = false;
new android.os.Handler().postDelayed(() -> this.m_someBoolFlag = true, 300);

5
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();
    }
}

4

다음은 setTimeout에 해당하는 것으로, 지연 후 사용자 인터페이스를 업데이트하려고 할 때 주로 유용합니다.

아시다시피 사용자 인터페이스 업데이트는 UI 스레드에서만 수행 할 수 있습니다. AsyncTask는 해당 스레드에서 onPostExecute 메서드를 호출하여이를 수행합니다.

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();

3
1. 마찬가지로, onProgressUpdate()또한 시뮬레이션하는데 사용될 수있다 setInterval(). 2. AsyncTask 스레드 풀 (또는 단일 스레드)에서 실행되므로 a. 다른 AsyncTask작업이 끝날 때까지 기다려야 할 수도 있습니다 . b . 풀에서 하나의 스레드를 차지합니다.
Pang

이 컨텍스트에서 비동기 작업을 사용하는 데는 많은 문제가 있습니다 (하나의 스레드 만 이유없이 스레드 잠금)-다른 솔루션이 훨씬 낫습니다.
Elemental

4

안드로이드 용 mp3 플레이어를 만들고 있었는데 현재 시간을 500ms 마다 업데이트하고 싶었 기 때문에 이렇게했습니다.

setInterval

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);
}

동일한 메서드를 재귀 적으로 호출하는

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.