2013-07-05 40 views
6

tôi đã có thêm Looper để đoạn mã sau:Hiểu những gì Looper là về trong Android

public class MyRunnable implements Runnable 
{ 
    @Override 
    public void run() 
    { 
     Looper.prepare(); 
     final Looper looper = Looper.myLooper(); 

     new Handler().postDelayed(
      new Runnable() 
      { 
      @Override 
      public void run() 
      { 
       try 
       { 
       } 
       catch (Exception ex) 
       { 
       } 
       finally 
       { 
       looper.quit(); 
       } 
      } 
      }, 100); 

     Looper.loop(); 
    } 
} 

Chú ý rằng tôi có một Runnable bên trong một Runnable. Runnable lồng nhau được thực hiện thông qua một Handler. Ban đầu tôi không có Looper nhưng Android phàn nàn rằng tôi cần gọi Looper.prepare trước khi thực hiện một chuỗi khác.

Tôi đọc trên Looper nhưng nó vẫn có vẻ khó hiểu. Dường như nó hoạt động như một loại đường dẫn tin nhắn nội bộ. Nó không phải là rõ ràng với tôi tại sao điều này là cần thiết vì không có tin nhắn đi từ runnable bên ngoài của tôi để runnable bên trong của tôi. Mặc dù đó là sự thật, có vẻ như Android chỉ làm cho quy tắc cứng rằng nếu bạn gọi một sợi từ một chủ đề, bạn PHẢI cũng gọi Looper.prepare. Ngay cả khi tôi chấp nhận điều đó, nó vẫn không giúp hiểu tại sao tôi cần gọi looper.loop và looper.quit. Nếu tôi bỏ qua Looper.loop, Handler của tôi không bao giờ chạy và đó là điều không rõ ràng. Looper.loop làm gì cho phép Handler của tôi chạy?

+1

bản sao có thể có của [android: Mục đích của Looper là gì và cách sử dụng nó?] (Http://stackoverflow.com/questions/7597742/android-what-is-the-purpose-of-looper-and -Làm thế nào để sử dụng nó). Có, nếu bạn muốn sử dụng Looper, thì bạn phải gọi Looper.prepare(). Các giải pháp thay thế để sử dụng Looper bao gồm việc tạo các luồng bình thường (song song) hoặc sử dụng AsyncTasks. Đọc liên kết SO mà tôi đã trích dẫn để có thêm một chút nền tảng. 'Hy vọng rằng sẽ giúp ... – paulsm4

+0

Sắp xếp giải thích nó. Vấn đề lớn nhất tôi thấy là đề cập đến Runnables là "tin nhắn". Đây không phải là "thông điệp" theo nghĩa truyền thống của thế giới lập trình vì Runnable là một đoạn mã thực thi hơn là dữ liệu đơn giản có chứa một thông điệp. Hơn nữa, ví dụ bạn đã chỉ ra thậm chí không bao gồm looper.quit được yêu cầu, cũng không cho biết rằng Looper.loop sẽ chặn vô thời hạn cho đến khi looper.quit được gọi. Looper nên được định nghĩa là không có gì ngoài một hàng đợi để thực hiện nhiều Runnables. – AndroidDev

Trả lời

8

Đây là một bài viết tuyệt vời về điều đó.

Looper and Handler in Android

Nó đi kèm cùng với một sơ đồ đơn giản mà dẫn đến sự hiểu biết thẳng của mối quan hệ giữa LoopersHandler.

On giản đồ này, chúng ta thấy rằng, trong cùng một sợi (mô tả bằng hình chữ nhật lớn), dù có bao nhiêu handler bạn tạo, họ sẽ tất cả được sử dụng cùng một Looper, tức là, looper độc đáo của chủ đề này.

Handlers & Loopers

Note:

Looper phải prepared để cho phép xử lý liên quan đến xử lý posted messages.

Ứng dụng Android, chính xác hơn, chuỗi giao diện người dùng ứng dụng Android (chủ đề chính), đã đi kèm với một looper chuẩn bị (mainLooper).

Đây là cách để Communicating with the UI Thread.

4

Một khái niệm đơn giản của looper:

  1. Mỗi sợi nhân tạo và chạy kết thúc khi nó thực hiện hoạt động cuối cùng của nó.

  2. Để ngăn chặn chấm dứt chuỗi của bạn, bạn có thể bắt đầu vòng lặp bằng cách gọi Looper.loop(), hãy nghĩ về câu hỏi đó là câu hỏi while(true){}. Trước khi gọi Looper.loop() bạn phải chuẩn bị vòng lặp với Looper.prepare(), nếu chưa được chuẩn bị. Để chấm dứt vòng lặp và kết thúc chủ đề của bạn, bạn sẽ cần gọi số looper.quit() trên looper.

Bây giờ cho các thông báo bạn nhận được từ Android:

Khi bạn tạo một Handler trong một thread, nó sẽ được ràng buộc với thread nó được tạo ra trong và khi bạn gửi Runnable sử dụng Handler này, mã chạy trên luồng của Trình xử lý. Vì vậy, khi hệ thống thấy rằng bạn muốn chạy một số mã (đặc biệt là 100ms trong tương lai) trên một Trình xử lý bị ràng buộc vào một chuỗi sẽ chết ngay khi nó kết thúc gọi phương thức bài mà nó đề xuất sử dụng Looper.loop() để ngăn chặn thread này chấm dứt và do đó cho phép bạn chạy Runnable thứ hai trong một thread vẫn còn tồn tại.

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