2011-11-18 31 views
5

xem xét lớp học này, AnimationThread:Tại sao run() chỉ được gọi một lần?

class AnimationThread implements Runnable { 
    public void pause() { 
     doAnimation = false; 
    } 

    public void doStart(){ 
     doAnimation = true; 
    } 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     if (doAnimation) { 
      //my code 
     } 

     try { 
      Thread.sleep(500); 
     } 
     catch (InterruptedException e) { 

     } 
    } 
} 

Bây giờ tôi bắt đầu chủ đề này trong onCreate của một hoạt động (chỉ cần trình bày mã thô):

AnimationThread animRunnable = new AnimationThread(); 
animationThread = new Thread(animRunnable); 
animationThread.start(); 

Nhưng run() là nhận được gọi là chỉ một lần (tôi truy tìm một bản ghi để xác nhận điều đó). Tôi chỉ muốn biết rằng khi tôi bắt đầu thread tại sao run() không được gọi lặp đi lặp lại với 500 giấc ngủ. Nó chỉ được gọi một lần.

Trả lời

12

Đó là cách nó được coi là.

Chủ đề chạy bằng cách thực thi phương thức chạy của nó (chỉ một lần). Sau đó nó được coi là đã hoàn thành/đã chết/hoàn thành/hoàn thành.

Nếu bạn muốn lặp lại, bạn phải tự làm điều đó (bên trong phương thức chạy) hoặc sử dụng một số ExecutorService để gọi Runnable liên tục.

+0

Cảm ơn. Tôi có logic. Tôi đảm bảo rằng bên trong chạy mã logic của tôi đang chạy liên tục. Thực ra trong tình huống của tôi, tôi muốn run() để thực hiện infinetly cho mục đích của tôi vì vậy tôi đã kèm theo logic của mình trong khi (true) bên trong chạy và animation xảy ra dựa trên trạng thái của biến trạng thái doAnimation. Cảm ơn. –

+0

Đó là một mô hình phổ biến. Tuy nhiên, bạn có thể muốn các chủ đề để chấm dứt cuối cùng để tắt chương trình. Hoặc bạn có thể sử dụng một chuỗi daemon cho điều đó. – Thilo

8

Tất nhiên phương thức run() sẽ được thực hiện một lần. Nếu bạn muốn lặp lại các câu lệnh bên trong phương thức run thì bạn phải sử dụng vòng lặp. Hãy xem TimerTask - sẽ chạy một tác vụ tại một thời điểm nhất định hoặc nhiều lần.

EDIT:

  1. Android - Controlling a task with Timer and TimerTask?
  2. Timer task schedule
+0

Cảm ơn. Bạn có thể cho tôi xem một liên kết ví dụ không. Xin vui lòng. –

+1

@ user925224 - Tôi đã chỉnh sửa bài đăng của mình. – adatapost

+0

+1 để tặng những gì người dùng yêu cầu .. – ngesh

0

run() là phương thức chỉ được thực hiện một lần bởi bất kỳ Thread nào. Bởi vì sau khi hoàn thành run method Chủ đề là dead or completed.
Vì vậy, đối với một chuỗi chạy sẽ chỉ thực thi những chuỗi. Nếu bạn không muốn hủy chuỗi thì bạn phải đảm bảo rằng kết thúc chạy ...

Các vấn đề liên quan