[android] 정의 된 간격으로 Android에서 Runnable 스레드를 실행하는 방법은 무엇입니까?

Android 에뮬레이터 화면에 일정한 간격으로 일부 텍스트를 표시하는 응용 프로그램을 개발했습니다. 나는 Handler수업을 사용하고 있습니다. 내 코드의 스 니펫은 다음과 같습니다.

handler = new Handler();
Runnable r = new Runnable() {
    public void run() {
        tv.append("Hello World");
    }
};
handler.postDelayed(r, 1000);

이 응용 프로그램을 실행하면 텍스트가 한 번만 표시됩니다. 왜?



답변

귀하의 예에 대한 간단한 해결책은 다음과 같습니다.

handler = new Handler();

final Runnable r = new Runnable() {
    public void run() {
        tv.append("Hello World");
        handler.postDelayed(this, 1000);
    }
};

handler.postDelayed(r, 1000);

또는 예를 들어 (원래 러너와 함께) 일반 스레드를 사용할 수 있습니다.

Thread thread = new Thread() {
    @Override
    public void run() {
        try {
            while(true) {
                sleep(1000);
                handler.post(this);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};

thread.start();

실행 가능 오브젝트를 실행을 위해 메시지 큐로 송신 될 수있는 명령으로 간주하고 해당 명령을 송신하는 데 사용되는 헬퍼 오브젝트로 핸들러를 처리 할 수 ​​있습니다.

자세한 내용은 여기 http://developer.android.com/reference/android/os/Handler.html


답변

new Handler().postDelayed(new Runnable() {
    public void run() {
        // do something...              
    }
}, 100);


답변

나는 매초마다 올바른 업데이트를 위해 Alex2k8의 첫 번째 솔루션을 향상시킬 수 있다고 생각합니다.

1. 원본 코드 :

public void run() {
    tv.append("Hello World");
    handler.postDelayed(this, 1000);
}

2. 분석

  • 상기 비용에서, 디스플레이 된 500 배 지연 시간이 500 * T 밀리 초인 후에 tv.append("Hello Word")비용 T 밀리 초를 가정한다
  • 장시간 실행하면 지연이 증가합니다

3. 해결책

지연을 피하려면 postDelayed () 순서를 변경하십시오.

public void run() {
    handler.postDelayed(this, 1000);
    tv.append("Hello World");
}


답변

반복 작업을 위해 사용할 수 있습니다

new Timer().scheduleAtFixedRate(task, runAfterADelayForFirstTime, repeaingTimeInterval);

처럼 불러

new Timer().scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {

            }
        },500,1000);

위의 코드는 0.5 초 후에 처음으로 실행 되며 매 마다 반복됩니다 (1000)

어디

태스크 는 실행될 메소드입니다.

최초 실행 시간

( 실행을 반복하는 시간 간격 )

둘째로

작업을 여러 번 실행하려는 경우 CountDownTimer 를 사용할 수도 있습니다 .

    new CountDownTimer(40000, 1000) { //40000 milli seconds is total time, 1000 milli seconds is time interval

     public void onTick(long millisUntilFinished) {
      }
      public void onFinish() {
     }
    }.start();

//Above codes run 40 times after each second

그리고 당신은 또한 runnable로 할 수 있습니다. 같은 실행 가능한 방법을 만듭니다

Runnable runnable = new Runnable()
    {
        @Override
        public void run()
        {

        }
    };

그리고이 두 가지 방법으로 부르십시오

new Handler().postDelayed(runnable, 500 );//where 500 is delayMillis  // to work on mainThread

또는

new Thread(runnable).start();//to work in Background 


답변

나는이 전형적인 경우, 즉 일정한 간격으로 무언가를 실행하는 Timer것이 더 적합하다고 생각합니다. 다음은 간단한 예입니다.

myTimer = new Timer();
myTimer.schedule(new TimerTask() {
@Override
public void run() {
    // If you want to modify a view in your Activity
    MyActivity.this.runOnUiThread(new Runnable()
        public void run(){
            tv.append("Hello World");
        });
    }
}, 1000, 1000); // initial delay 1 second, interval 1 second

사용하면 Timer몇 가지 장점이 있습니다.

  • 초기 지연 및 간격은 schedule함수 인수
  • 타이머는 간단하게 호출하여 중지 할 수 있습니다 myTimer.cancel()
  • 하나의 스레드 만 실행하려면 새 스레드 myTimer.cancel() 예약 하기 전에 호출 해야합니다 (myTimer가 null이 아닌 경우).

답변

Handler handler=new Handler();
Runnable r = new Runnable(){
    public void run() {
        tv.append("Hello World");
        handler.postDelayed(r, 1000);
    }
};
handler.post(r);


답변

Handler.post () 메소드의 문서를 올바르게 이해하면 :

Runnable r이 메시지 큐에 추가되도록합니다. 실행 가능 파일은이 핸들러가 연결된 스레드에서 실행됩니다.

따라서 @ alex2k8에서 제공하는 예제는 올바르게 작동하지만 동일하지 않습니다. where Handler.post()가 사용되는 경우 새 스레드가 작성되지 않습니다 . 당신 은 EDT에 의해 실행될 Runnable스레드에 게시 합니다 . 그 후에는 EDT 만 실행됩니다HandlerRunnable.run() 다른 하지 않습니다.

기억하십시오 :
Runnable != Thread.