2013-03-31 4 views
1

내 BlackBerry 앱에서 다음에 표시 할 화면을 결정하기 위해 아래 코드를 사용하고 있습니다. 그러나 몇 가지 이상한 이유로 인해 run()의 코드는 화면의 터치를 한 번 눌러 메뉴 항목을 선택할 때 두 번 실행되지만 휴대 전화의 키패드를 사용할 때는 한 번만 실행됩니다.invokeLater의 run() 메서드를 두 번 호출 중

어떤 아이디어가 원인 일 수 있습니까? 내가 볼 수없는

protected boolean navigationClick(int status, int time) 
{ 
    switch (mainMenu.getSelectedIndex()) 
    { 
    case 0: 
     UiApplication.getUiApplication().invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       UiApplication.getUiApplication().pushScreen(new PollListScreen()); 
      } 
     }); 
     break; 
    case 1: 
     UiApplication.getUiApplication().invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       UiApplication.getUiApplication().pushScreen(new UpdateProfileScreen()); 
      } 
     }); 
     break; 

     // Etc. 

    default: 
     break; 
    } 
    return true; 
} 
+0

'invokeAndWait()'대신이 문제가 발생하지 않습니다. – Bataleon

+0

어떤 종류의 클래스에서이'navigationClick() '메소드를 대체하고 있습니까? * what *의 하위 클래스? – Nate

답변

1

정확히 당신이 보여있는 코드를 배치했지만, 내가 생각하지 않는 곳이 너무 많은 것들이 여기에 잘못 갈 수 있습니다.

run()이 여러 번 호출되는 경우 navigationClick()이 여러 번 호출됩니다.

navigationClick()은 의 소스 (예 : touch vs. trackwheel)에 따라 다르게 호출 될 수 있습니다. 그러나 status 매개 변수를 검사하여이를 분류 할 수 있어야합니다. 이런 식으로 뭔가가 당신을 위해 할 수 있습니다

protected boolean navigationClick(int status, int time) 
{ 
    if (status != 0) // <-- NOTICE THIS CHECK!!! 
    { 
     switch (mainMenu.getSelectedIndex()) 
     { 
      case 0: 
      // your code cut out here for clarity 
     } 
    } 
    return true; 
} 

당신이 invokeAndWait()를 사용하는 경우

, 당신은 아마 navigationClick()의 두 번째 호출하는 문제가 발생할 수 있습니다 UI 스레드를 차단하고 있습니다. 두 번째 잘못을 사용하여, 그래도 될 것입니다. invokeLater()이 일반적으로 선호됩니다.

+0

Spate on Nate! 'navigationClick()'이 어떤 이유에서 두 번 호출되고 있는데 왜 그럴지 모르겠습니다. 이것은 터치 이벤트에서만 발생하며 스크롤 휠에서 클릭하면 'navigationCLick()'이 한 번만 호출됩니다. 어떤 아이디어? – Bataleon

+0

@Bataleon, 내가 언급했듯이, 전달 된 "상태"매개 변수의 값을 검사합니다. 두 개의 개별 호출에 대해 서로 달라야하며, 하나씩 필터링 할 수 있습니다. [javadoc for navigationall() for more] (http://www.blackberry.com/developers/docs/5.0.0api/net/rim/device/api/ui/Field.html#navigationClick%28int,%20int)를 참조하십시오. % 29) – Nate

+0

"status"매개 변수의 값은 두 호출 모두에 대해 0입니다. 이상하게도'nacigationClick()'은 시뮬레이터에서만 두 번 호출됩니다. 실제 하드웨어 (BlackBerry Torch)에서는 모든 것이 예상대로 작동합니다. – Bataleon

관련 문제