2011-12-27 2 views
0

사용자가 문자를 입력 할 수있는 텍스트 상자가 있으며 제안 상자가 열립니다. 키 업 이벤트에서 이벤트를 발생 시켰습니다. 비동기 호출이 시작된 후에 타이머가 설정되고 비동기 호출이 성공하면 제안 목록이로드됩니다. 문제는 문자 입력을 시작하면 브라우저의 로딩 기호가 나타나고 비동기 호출이 성공적으로 반환되고 제안 사항이 표시 될 때까지 텍스트 상자에 더 이상 문자를 입력 할 수 없다는 것입니다. 요점은 호출이 async이면 브라우저가 UI에서 이벤트를 차단하는 이유입니다.GWT 비동기 호출 UI 차단

다음은 코드입니다. 화재 이벤트는 비동기 호출을 호출하고 화재 종료 이벤트 메시지를 인쇄합니다. 따라서 비동기 호출이 차단되지 않습니다. 공공 무효 showSuggestions (최종 문자열 쿼리) {

ArrayList<PCTSuggestion> list; 
    System.out.println("Show Suggestions"); 
    if (query.length() > 0) { 
     GWT.log(query); 
     list = cacher.getCachedvalues(query); 
     //list = new ArrayList<PCTSuggestion>(); 
     if(list != null) { 
      if(!isTabOut() || !isBlurred()) { 
       display.showSuggestions(PCTSuggestBox.this, list, true, isAutoSelectEnabled(), suggestionCallback); 
      } else { 
       display.hideSuggestions(); 
      } 
     } else { 

      this.fireEvent(new NewSuggestionEvent(query, limit));  
      System.out.println("End of Fire Event"); 

     } 
     //display.showSuggestions(PCTSuggestBox.this, null, true, isAutoSelectEnabled(), suggestionCallback); 
    } else { 
     display.hideSuggestions(); 
    } 
} 
+1

이벤트 핸들러에서 비동기 호출 완료를 차단하고 있습니까? 실제 코드 중 일부를 공유 할 수 있습니까? – bobbymcr

답변

1

이 일어나고있는 이유는 1000 이유가 될 수 있습니다. AsyncCallbacks는 실제로 그렇게 비동기 적이 지 않습니다. 실제 HTTP 요청을 보낼 때만 UI 스레드를 차단하지 않습니다. 그러나 요청 생성, 응답 구문 분석 및 콜백 본문 처리는 UI 스레드에서 평소처럼 발생합니다. 가능한 범인 :

데이터의
  • 미친 양이 네트워크
  • 수신 된 데이터의 일부 비효율적 인 처리를 통해 전송되는
    • DEVMODE와 크롬을 사용하여 제안
    • 의 효과 렌더링 (크롬 DEVMODE 극단적으로 느린)

    코드의 어떤 부분이 느린 지 실제로 측정하는 것이 더 쉬워 지므로 여기에 다른 996의 이유를 적어 두지는 않겠습니다.

  • +0

    또한 개발 모드가 가장 큰 이유입니다. –

    0

    입력란의 모든 키 입력에서 텍스트 상자와 같은 비동기 호출을 피하십시오.

    귀하가 Google 검색의 제안에 표시되는 내용은 GWT가 아닙니다.

    제안 사항대로 입력하고 싶다면 GWT에서 올바르게 구현하는 방법을 모르겠다. 나는 자바 스크립트에서 응용 프로그램을 작성해야 할 것입니다. 제안대로 (as-you-type) 서비스는 별도의 숨겨진 분리 된 프레임/iframe에 있습니다. 키 업 핸들러는 해당 프레임과 통신합니다. 그런 식으로, 나는 (내가 옳지 않다는 느낌을 준다.) 텍스트 상자는 비동기 통신과 충돌하지 않을 것이다.

    아마도 Google 자바 스크립트 클로저 도구 http://code.google.com/closure/을 고려해야합니다.

    GWT를 사용하면 서버 기반의 짝수 버스 없이도 다른 프레임에 앉아있는 다른 GWT 응용 프로그램을 처리하는 것이 거의 불가능합니다.

    서로를 참조하고 서로 통신해야하는 둘 이상의 프레임이 해당 상위 프레임의 자식이어야하므로 조정하는 부모 프레임이 필요합니다.

    그러나 자바 스크립트로 작성할 수 있습니다. javacript로 작성하면 GWT의 모든 밧줄과 수갑에서 벗어날 수 있습니다.

    그런 다음 서비스를 JSNI 호출로 랩핑 할 수 있으므로 레이아웃을 위해 GWT를 계속 사용할 수 있습니다. 내가 보는 문제는 JSNI에 의해 호출 된 외부 자바 스크립트에서 텍스트 상자를 어떻게 보이게 할 것입니까? 아마도 텍스트 상자에 ID를 부여할까요? 그러나 잠시 기다려주십시오. GWT는 위젯에 ID를 부여하는 것을 원하지 않습니다. 디버그 ID를 할당 할 수 있지만 프로덕션 코드에서 사용할 수 있습니까?

    텍스트 상자에 uibinder의 HTML 요소를 사용할 수 있습니다. 그리고 uibinder를 사용하면 HTML 요소에 ID를 할당 할 수 있습니다. 그러나 그렇다면 DOM을 통해 입력 텍스트 상자의 값을 읽어야합니다. 나는 GWT/javascript를이 방법으로 섞어 본 적이 없다. 단지 나의 생각한 실험이다.

    +1

    전혀 동의하지 않습니다. Suggest-as-you-type은 GWT에서 완벽하게 작동합니다. 그러나 저자와 달리 표준 GWT API를 사용했습니다. –

    +0

    Alexey가 제안한대로, GWT'SuggestBox'를 사용하면 모든 것이 이미 완료되었습니다. –

    관련 문제