2014-10-04 21 views
6

Tôi đang cố gắng để xây dựng một ứng dụng Android mà lặp đi lặp lại sẽ chạy một số quá trình mỗi 10 phút. Như tôi đã phát hiện ra Handlers là đáng tin cậy hơn giờ hoặc lịch. Vì vậy, tôi sẽ phát triển ứng dụng của mình bằng cách sử dụng Handlers bằng cách sử dụng các mã dưới đây.Trình xử lý Android cho tác vụ lặp lại - nó sẽ chồng lên nhau? Timer-nhiệm vụ VS handler VS báo động-manager

Tôi hơi lo ngại rằng các mã bên dưới sẽ tạo riêng biệt Handlers mỗi khi tôi khởi động ứng dụng và giữ cho chúng chạy song song, có thể kể từ khi tôi đang tạo Handler trên onCreate.

Vì vậy, cách tốt nhất để giữ chỉ một duy nhất Handler chạy ở chế độ nền tại một thời điểm?

private Handler handler; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    handler = new Handler(); // new handler 
    handler.postDelayed(runnable, 1000*60*10); // 10 mins int. 
    setContentView(R.layout.activity_pro__sms); 
} 

private Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
     /* my set of codes for repeated work */ 
     foobar(); 
     handler.postDelayed(this, 1000*60*10); // reschedule the handler 
    } 
}; 
+0

Chỉ cần tự hỏi: bối cảnh của 'công việc lặp đi lặp lại' của bạn là gì? Hoặc có lẽ tốt hơn cho biết: loại ứng dụng là gì? Nó có thể là một giả định rất hào phóng để nghĩ rằng người dùng sẽ chủ động sử dụng ứng dụng của bạn trong 10 phút tại một thời điểm (trừ khi nó giống như một trò chơi hay như vậy, do đó câu hỏi của tôi). Sử dụng 'Handler' trong khi ứng dụng của bạn * không * ở mặt trước, không thể thực hiện đúng hành động. –

+0

Tại sao không sử dụng dịch vụ? –

+0

Tôi không cần bỏ lỡ tác vụ bằng cách chạy ngay cả khi đang ở chế độ ngủ. Các dịch vụ có thể hoạt động trong khi ở chế độ chờ (ngủ) không? Hay tôi cần có khóa đánh thức. Điều gì về việc sử dụng tài nguyên của các dịch vụ so với AlarmManager (bây giờ tôi đang thử những thứ với trình quản lý báo động) –

Trả lời

4

Tôi quyết định trả lời câu hỏi của riêng mình vì tôi đã tìm ra cách thực hiện đúng cách. Cách Android. Trước hết những gì tôi đã cố gắng làm và đăng trong câu hỏi là một cách tiếp cận sai với yêu cầu của tôi. Bây giờ tôi đăng bài này để người khác sẽ không làm điều đó sai cách nhưng theo cách sau.

Android có ít tùy chọn cho thời gian.

  1. Timer-task -> chạy trong khi ứng dụng còn hoạt động. tốt nhất cho thời gian ngắn hạn. Sử dụng tài nguyên cao hơn.

  2. Trình xử lý -> chạy trong khi ứng dụng còn hoạt động. Nhưng không thích hợp để sử dụng làm bộ lập lịch biểu. (Đây là những gì tôi đã hỏi và nó không phải là cách chính xác để làm điều đó). Handlers là cách tốt nhất để làm điều gì đó liên tục cho đến khi ứng dụng bị giết.

  3. Trình quản lý báo thức -> Cách tốt nhất để lên lịch cho một điều gì đó xảy ra trong tương lai ngay cả khi ứng dụng bị giết. (đây là những gì tôi nên áp dụng cho ứng dụng của tôi).

Đây là những gì tôi đã tìm ra. Đúng nếu tôi sai.

+4

Điều này là không chính xác. Một Handler chỉ đơn giản là lịch trình các nhiệm vụ trên thread ứng dụng. Xử lý tác vụ chết khi ứng dụng bị giết. –

+0

Vì vậy, những gì sẽ xảy ra khi gọi đến phương thức "postDelayed (Runnable, long)". Nó sẽ giữ cho các thread ứng dụng còn sống để nó có thể kích hoạt runnable. –

+2

Không! Sự kiện trì hoãn sẽ đơn giản không bao giờ xảy ra. –

3

Bạn có thể mở rộng lớp Application và làm công việc của bạn trong đó.

public class App extends Application { 

    private Handler handler; 

    @Override 
    protected void onCreate() { 
     super.onCreate(); 
     handler = new Handler(); // new handler 
     handler.postDelayed(runnable, 1000*60*10); // 10 mins int. 
     setContentView(R.layout.activity_pro__sms); 
    } 

    private Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
      /* my set of codes for repeated work */ 
      foobar(); 
      handler.postDelayed(this, 1000*60*10); // reschedule the handler 
     } 
    }; 
} 

Và tuyên bố lớp học của bạn trong manifest:

<application android:name=".App"> 

Edited

Nhưng nó sẽ chỉ làm việc nếu ứng dụng của bạn đang chạy, nếu không bạn có thể sử dụng AlarmManager.

+0

Cảm ơn. Tôi sẽ thử và trả lời lại trong vòng vài phút. –

+0

thực sự những gì tôi muốn là để ngăn chặn nhiều trình xử lý được tạo. nên có một cách, trong trang web nhà phát triển Android họ nói xử lý là cách phù hợp nhất. –

+2

Điều Vàng đã cho bạn sẽ chỉ tạo ra một người xử lý và lặp lại quy trình dựa trên thời gian trôi qua. Lưu ý rằng anh ta đang mở rộng lớp Ứng dụng, nó chỉ được gọi một lần, tức là khi ứng dụng của bạn được tạo ra (khi bạn khởi động ứng dụng). Trình xử lý sẽ ngừng hoạt động nếu bạn hủy hoàn toàn ứng dụng, nếu không, chỉ một trình xử lý sẽ chạy cùng một lúc. Nếu bạn đang tìm một trình xử lý để chạy liên tục, hãy sử dụng AlarmManager như đã đề cập ở trên. – NightwareSystems

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