문제

J2ME 응용 프로그램을 작성하고 있습니다. 조각 중 하나는 디렉토리의 내용을 정기적으로 투표하는 것입니다. 새로운 것이 있으면 화면에 페인트를 칠합니다. UI 양식에 포인터가있는 폴링 스레드를 시작하고 폴링 스레드가 양식으로 호출되는 것을 찾을 때 동기화 된 메소드를 호출하여 디스플레이를 업데이트합니다. 이것은 잘 작동하는 것 같습니다.

내가 가진 질문은 이것입니다. C#/. Net에서는 UI가 아닌 스레드가 UI를 업데이트하는 것이 좋지 않다는 것을 알고 있으며,이를 처리하는 올바른 방법은 UI 스레드까지 위임하는 것입니다.

예 : 다음 :

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

이 프로세스를 관리하는 방법과 동등한 J2ME가 있습니까? Java는 어떻습니까? 아니면 Java/J2ME가 이것과 관련하여 더 멋지게 플레이합니까? 그렇지 않다면 어떻게 이루어 집니까?

편집] 스윙은 스윙 혜성을 통해 내가 요구하는 내용을 지원하는 것으로 보입니다. J2ME와 동등한 프레임 워크가 있습니까?

도움이 되었습니까?

해결책

Java와 관련하여, 당신이 묘사하는 것은 Swingworker (작업자 스레드).

스윙 프로그램이 장기 실행 작업을 실행 해야하는 경우 일반적으로 배경 스레드라고도하는 작업자 스레드 중 하나를 사용합니다.

스윙 프로그램에는 다음과 같은 종류의 스레드가 포함됩니다.

  • 초기 스레드, 초기 응용 프로그램 코드를 실행하는 스레드.
  • 모든 이벤트 처리 코드가 실행되는 이벤트 디스패치 스레드. 스윙 프레임 워크와 상호 작용하는 대부분의 코드 도이 스레드에서 실행해야합니다.
  • 시간이 많이 걸리는 배경 작업이 실행되는 배경 스레드라고도하는 작업자 스레드.

단일 스레드 규칙:
스윙 구성 요소가 실현되면 해당 구성 요소의 상태에 영향을 미치거나 의존 할 수있는 모든 코드는 이벤트 디스플레이션 스레드에서 실행되어야합니다.

J2EE 컨텍스트에서 사용될 때는 당신이 할 때주의해야합니다. EJB에서 스윙 워크를 참조합니다.

에 관하여 J2ME, 그것은 당신이 당신의 애플리케이션을 중간에 지원하는 장치에서 실행될 표준 미드렛으로 응용 프로그램을 개발하고 있는지에 따라 다릅니다. 예를 들어 Rimlet로서 BlackBerry-Specific API를 사용하여 BlackBerry 장치에서만 실행되는 CLDC 기반 애플리케이션입니다.

MIDP의 UI 클래스와 달리 RIM은 UI 작업이 이벤트 스레드에서 발생한다는 의미에서 스윙과 유사하며, 이는 MIDP에서와 같이 스레드 안전하지 않습니다. 이벤트 스레드에서 코드를 실행하려면 응용 프로그램은 이벤트 객체의 잠금을 얻거나 Invokelater () 또는 InvokeAndwait ()를 사용해야합니다 - 개발자를위한 추가 작업이지만 정교함은 가격표와 함께 제공됩니다.

이 아니라면 lcdui, 당신은 할 수 있습니다 여러 스레드에서 양식에 액세스하십시오.

다른 팁

Java Me의 많은 프로필이 있습니다. 당신이 미드를 의미한다면 Display.runSerially 당신이 원하는 것입니다.

AWT (Swing)의 경우 사용할 것입니다 EventQueue.invokeLater (SwingUtilities.invokeLater Java 1.1이 없기 때문에 필요합니다. EventQueue 방법 -1.2는 10 번째 생일을 축하하려고합니다). 공통 DOM API의 경우 사용하십시오 DOMService.invokeLater.

GUI API가 스레드 안전성에 대해 말할 수 있다고 주장하든 아마도 잘못되었을 것입니다 (스윙 주장 중 일부는 JDK7에서 구현할 수 없기 때문에 제거됩니다). 어쨌든 응용 프로그램 코드는 스레드 안전성이 아닐 것입니다.

J2ME 앱의 경우 간단하게 유지하고 싶을 것입니다. 가장 중요한 것은 이벤트 스레드에서만 UI 구성 요소를 터치하는 것입니다. 이 작업을 수행하는 직접적인 방법은 사용하는 것입니다 재고자 또는 송장. 라이브러리에 따라 그 이상으로 액세스 할 수 없습니다. 일반적으로 플랫폼에 제공되지 않으면 스레드 지원이없고 문제가되지 않는 것과 같습니다. 예를 들어 BlackBerry는 그것을 지원합니다.

SWT에서 개발되면 이는 디스플레이 객체의 asyncexec () 메소드를 통해 달성됩니다. UI 스레드가 다른 스레드에서 수행 된 변경 사항을 실행하도록 실행 가능한 구현 객체를 전달합니다.

이것은 빌린 예입니다 여기

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());
         }
      }
   }
}

나는 거의 모든 제조업체가 만든 수백만 개의 전화기에서 복잡한 GUI가 실행되는 큰 미드 렛을 가지고 있기 때문에 MIDP UI 툴킷이 실제로 스레드 안전하다는 것을 증명할 수 있으며, 그와 관련하여 문제를 본 적이 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top