2013-03-15 35 views
14

Tôi có một hoạt ảnh trong ứng dụng Android của mình, nhấp nháy một màu TextView khác nhau. Tôi đã sử dụng một TimerTask, Timer, và Runnable phương pháp để thực hiện điều này. Những gì tôi cần làm là dừng thread khi người dùng rời khỏi ứng dụng trong suốt hoạt ảnh này trong onPause() và tiếp tục chuỗi khi người dùng quay trở lại ứng dụng trong onResume(). Sau đây là mã tôi đã thực hiện, nhưng nó không hoạt động (các onPause(), và onResume() miếng), và tôi không hiểu tại sao. Tôi đã đọc một vài bài viết khác về những vấn đề tương tự, nhưng họ đã không giúp tôi tìm ra những gì phải làm trong tình huống của tôi. Tôi đã đọc rằng TimerTasks đã lỗi thời và có lẽ tôi nên sử dụng phương thức ExecutorService; nó không rõ ràng với tôi như thế nào để thực hiện chức năng này.Cách tạm dừng và tiếp tục TimerTask/Timer

...timerStep5 = new TimerTask() { 

     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
       if (b5) { 
        cashButton2SignalText.setBackgroundColor(Color.RED); 
        cashButton2SignalText.setTextColor(Color.WHITE); 
        b5=false; 
       } else { 
        cashButton2SignalText.setBackgroundColor(Color.WHITE); 
        cashButton2SignalText.setTextColor(Color.RED); 
        b5=true; 
       } 
       } 
      }); 
     } 
}; 

timer5.schedule(timerStep5,250,250); 

} 

public void onPause(){ 

    super.onPause(); 

    timerStep5.cancel(); 

} 

public void onResume(){ 

    super.onResume(); 

    timerStep5.run(); 

} 
+0

có thể trùng lặp của [Tạm dừng/dừng và bắt đầu/khôi phục Java TimerTask liên tục?] (Http://stackoverflow.com/questions/2098642/pausing-stopping-and-starting-resuming-java-timertask-continuously) – Gboy

Trả lời

12

Sau khi TimerTask bị hủy, không thể chạy lại, bạn phải tạo phiên bản mới.

đọc chi tiết tại đây:

https://stackoverflow.com/a/2098678/727768

ScheduledThreadPoolExecutor được khuyến khích cho mã mới hơn, nó xử lý các trường hợp ngoại lệ như nhiệm vụ và dành thời gian lâu hơn khoảng thời gian dự kiến.

Nhưng đối với nhiệm vụ của bạn, TimerTask là đủ.

+0

Ok, tôi đã xem bài đăng này trước đó và đã nhầm lẫn với nó; có thể bạn có thể làm rõ điều gì đó cho tôi: người dùng có thể rời khỏi ứng dụng của tôi trong hoạt động TimerTask và quay lại hoạt động đó nhiều lần. Điều đó có nghĩa là tôi sẽ phải tạo một thể hiện mới của TimerTask trong onResume() mỗi lần người dùng rời khỏi trong hoạt động này và trả về? – embersofadyingfire

+0

Câu hỏi: Nếu tôi bỏ qua hành động của người dùng rời khỏi hoạt động này một lúc và quay trở lại và bỏ qua bất kỳ triển khai nào để tạm dừng và tiếp tục TimerTask, nhưng đã triển khai onStop() để hủy TimerTask khi người dùng cuối cùng chuyển sang hoạt động khác, điều này có gây ra một số loại rò rỉ bộ nhớ trong khi hoạt động TimerTask bị tạm dừng không? – embersofadyingfire

+1

Tôi không nghĩ rằng sẽ có bất kỳ rò rỉ bộ nhớ nào, nhưng nó không có ý nghĩa để cho nhiệm vụ cập nhật giao diện người dùng của bạn chạy trong nền không có gì. Có, bạn phải tạo TimerTask khi đang di chuyển và không thể sử dụng lại được. Nó được thiết kế theo cách này. (Tôi đoán cho thread-an toàn) Ngoài ra onResume không phải là một số vòng lặp chặt chẽ, chi phí của việc tạo ra một đối tượng là không đáng kể. –

2

Đây là cách tôi đã làm. Thêm pauseTimer boolean nơi bao giờ tạm dừng diễn ra (nút nghe có lẽ) và không tính giờ nếu đúng.

private void timer(){ 
    Timer timer = new Timer(); 
    tv_timer = (TextView) findViewById(R.id.tv_locationTimer); 
    countTimer = 0; 
    timer.scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        String s_time = String.format("%02d:%02d:%02d", 
          countTimer/3600, 
          (countTimer % 3600)/60, 
          countTimer % 60); 
        tv_timer.setText(s_time); 
        if (!pauseTimer) countTimer++; 
       } 
      }); 
     } 
    }, 1000, 1000); 
}