2008-11-15 46 views
5

Tôi đang viết một ứng dụng J2ME. Một trong những phần là một cái gì đó thăm dò ý kiến ​​các nội dung của một thư mục định kỳ, và, nếu có bất kỳ điều mới, vẽ chúng trên màn hình. Tôi đã thực hiện điều này bằng cách có biểu mẫu giao diện người dùng khởi chạy một chuỗi thăm dò với một con trỏ quay lại chính nó và khi chuỗi thăm dò tìm thấy thứ gì đó mà nó gọi lại biểu mẫu và gọi phương thức được đồng bộ hóa để cập nhật hiển thị của nó. Điều này dường như làm việc tốt.Tương tác với các chuỗi giao diện người dùng trong Java/J2ME

Câu hỏi tôi có là này. Trong C# /. NET Tôi biết nó không phải là tốt đẹp để có chủ đề không giao diện người dùng cập nhật giao diện người dùng, và cách chính xác để xử lý này là để ủy quyền nó lên đến thread UI.

Ví dụ: như sau:

public void DoSomeUIThing() 
{ 
    if (this.uiComponent.InvokeRequired) 
    { 
     this.uiComponent.Invoke(someDelegateThatCallsBackToThis); 
    } 
    else 
    { 
     this.uiComponent.Text = "This is the update I want to happen"; 
    } 
} 

Có tương đương J2ME về cách quản lý quy trình này không? Làm thế nào về Java? Hoặc Java/J2ME chỉ chơi đẹp hơn liên quan đến điều này? Nếu không, làm thế nào được thực hiện?

[EDIT] Dường như Swing hỗ trợ những gì tôi hỏi về phương thức SwingUtilities.invokeLater() và invokeAndWait(). Có một khuôn khổ tương đương cho J2ME?

+0

Chỉ cần hoàn thành câu trả lời của tôi với thông tin cụ thể J2ME – VonC

+0

Cảm ơn! Ứng dụng của tôi là LCDUI vì vậy tôi đoán tôi không phải lo lắng về điều này (ít nhất là nếu tôi tin rằng David Pierce). – Cory

Trả lời

5

Về Java, những gì bạn mô tả trông giống như SwingWorker (worker thread).

Khi chương trình Swing cần thực thi tác vụ dài, nó thường sử dụng một trong các chuỗi công nhân, còn được gọi là chủ đề nền.

Một chương trình Swing bao gồm các loại sau đây của chủ đề:

  • đề ban đầu, các chủ đề mà thực thi mã ứng dụng ban đầu.
  • Chuỗi gửi sự kiện, nơi tất cả mã xử lý sự kiện được thực hiện. Hầu hết các mã tương tác với khung công tác Swing cũng phải thực thi trên luồng này.
  • Chủ đề công nhân, còn được gọi là chủ đề nền, nơi thực hiện các tác vụ nền tốn thời gian.

Single-thread rule:
Khi một thành phần Swing đã được thực hiện, tất cả các mã có thể ảnh hưởng hoặc phụ thuộc vào tình trạng của thành phần đó nên được thực hiện trong các event-dispatching thread.

Khi được sử dụng trong ngữ cảnh J2EE, bạn cần phải cẩn thận khi bạn là referencing a SwingWorker from an EJB.

Về J2ME, nó phụ thuộc nếu bạn đang phát triển ứng dụng của bạn như một MIDlet tiêu chuẩn mà sẽ chạy trên bất kỳ thiết bị MIDP-kích hoạt, hoặc ví dụ như một RIMlet, một ứng dụng CLDC dựa trên sử dụng BlackBerry cụ thể Các API và do đó sẽ chỉ chạy trên các thiết bị BlackBerry.

Vì không giống như các lớp giao diện người dùng của MIDP, RIM tương tự như Swing theo nghĩa là các hoạt động UI xảy ra trên chuỗi sự kiện, không an toàn với luồng như trong MIDP. Để chạy mã trên chuỗi sự kiện, một ứng dụng phải có khóa trên đối tượng sự kiện hoặc sử dụng invokeLater() hoặc invokeAndWait() - công việc phụ cho nhà phát triển, nhưng sự phức tạp đi kèm với thẻ giá.

Nhưng đối với LCDUI, bạn có thể access a form from multiple threads.

+0

Xem chỉnh sửa - liên kết "quy tắc một luồng" mô tả cách thực hiện điều này để xoay. Bạn có biết gì về thứ gì đó tương tự trong J2ME không? – Cory

1

Đối với các ứng dụng j2me, bạn có thể muốn giữ nó đơn giản. Điều chính là chỉ chạm vào các thành phần giao diện người dùng trong chuỗi sự kiện. Cách trực tiếp để thực hiện việc này là sử dụng invokeLater or invokeAndWait. Tùy thuộc vào thư viện của bạn, bạn sẽ không có quyền truy cập vào bất cứ điều gì nhiều hơn thế. Nói chung, nếu chúng không được cung cấp trong nền tảng của bạn, nó có thể tương đương với việc không có hỗ trợ luồng và không phải là vấn đề. Ví dụ: the blackberry does support it.

1

Nếu bạn phát triển theo SWT, điều này được thực hiện bằng phương thức asyncExec() của đối tượng Hiển thị. Bạn vượt qua một đối tượng thực hiện Runnable để thread UI thực hiện các thay đổi được thực hiện trong thread khác.

Đây là một ví dụ mượn từ here

public void itemRemoved(final ModelEvent me) 
{ 
    final TableViewer tableViewer = this.viewer; 

    if (tableViewer != null) 
    { 
     display.asyncExec(new Runnable() 
     { 
     public void run() 
     { 
      tableViewer.remove(me.getItem()); 
     } 
     } 
    } 
} 
4

Có rất nhiều hồ sơ của Java ME. Nếu bạn có nghĩa là MIDP thì Display.runSerially là những gì bạn muốn.

Đối với AWT (Swing), bạn sẽ sử dụng EventQueue.invokeLater (SwingUtilities.invokeLater chỉ cần thiết do Java 1.1 không có phương thức EventQueue - 1.2 sắp chào mừng sinh nhật lần thứ mười). Đối với API DOM phổ biến, hãy sử dụng DOMService.invokeLater.

Không có vấn đề gì một API GUI có thể thực hiện về an toàn luồng có thể là sai (một số xác nhận quyền sở hữu của Swing được loại bỏ trong JDK7 vì chúng không thể thực hiện được). Trong mọi trường hợp, mã ứng dụng không chắc chắn là an toàn chỉ.

1

Tôi có thể chứng thực rằng bộ công cụ giao diện người dùng MIDP thực sự an toàn với luồng, vì tôi có MIDlet lớn với GUI phức tạp chạy trên hàng triệu điện thoại được tạo ra bởi hầu hết các nhà sản xuất và tôi chưa bao giờ gặp vấn đề gì.

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