2014-04-16 3 views
0

사전 앱과 같은 앱을 만듭니다. 사용자가 Edittext를 입력 할 때 AsyncTask를 호출하여 화면에 결과를 계산하고 업데이트합니다 (onPostExecute() 메서드에 UI 업데이트 코드 입력). 그러나, 당신이 조금 빠르면, eddittext는 반응이 없게됩니다 (약간의 대기 시간). 나는 많은 AsyncTasks (입력 문자에 대한 각 AsynTask)가 실행되기 때문에이 promblem이 발생한다고 생각합니다. 그래서 새로운 과제를 부르기 전에 첫 번째 과제를 중단해야한다고 생각합니다. 내가 맞습니까? 이 상황에서 어떻게해야합니까?Android에서 반응하는 UI

답변

0

비동기 작업에 필터 메서드를 구현할 필요가 없습니다. 첫 글자가 editbox에 쓰여지고 임시 배열에 결과를 저장할 때 데이터에 필터 메소드를 호출 한 다음 다른 문자가 쓰여지면 기술적으로 원래 데이터보다 정보가 적은 임시 데이터에 필터 메소드를 호출합니다. 이렇게하면 editbox에 입력 할 때 데이터 세트의 dimmension이 줄어 듭니다. 또한이 방법을 사용하여 이전 데이터 세트를 저장할 수 있으므로 백 스페이스 키를 누를 때 필터 메소드를 다시 호출 할 필요가 없으며 이전 저장된 임시 데이터 세트로 이동합니다. 나를 위해, 그것은 잘 작동하고 효율적이기 때문에 비동기 작업을 사용하지 않아도됩니다.

+0

좋은 아이디어! 그러나 좀 더 구체적으로, 전체 텍스트 검색을 사용하여 데이터 세트를 얻습니다. 따라서 데이터 세트가 커서에 있습니다. 편지를 입력하면 다시 쿼리해야하고 새 커서가 반환됩니다. 커서로 전체 텍스트 검색을 제공하지 않기 때문에 이전 커서를 필터링 할 수 없습니다. –

+0

내 문제는 아마도이 예제와 같을 것이라고 생각합니다. 'a'를 입력하면 전체 텍스트 검색을 수행하고 3000 개의 행이 반환됩니다. 이 행을 계산하고 UI로 업데이트합니다. 그러나이 과정이 끝나지 않은 상태에서 'n'문자를 입력하면 (이제는 'an'이 편집문에 있음) 200 개의 행이 반환 된 새 커서가 반환됩니다. 그래서 커서를 다시 계산해야합니다. 이것은 아마도 편집 문구의 대기 시간을 초래할 수 있습니다. 좀 더 구체적인 해결책을 (코드별로) 줄 수 있습니까? –

0

하나의 스레드 만 사용하는 것이 좋습니다. 검색 스레드는 데이터 검색을 기다려야하고 검색을 수행하고 새 데이터가 될 때까지 기다려야합니다. 예 :

private static class SearchThread extends Thread{ 

    private Object monitor = new Object(); 
    private String value; 

    public void search(String value){ 
     this.value = value; 
     synchronized (monitor){monitor.notify();} 
    } 

    @Override 
    public void run() { 
     while(true){ 
      try {System.out.println("Wait for search data."); synchronized (monitor){monitor.wait(); } 
      } catch (InterruptedException e) {e.printStackTrace();} 

      System.out.println("Searching for " + value); 
     } 
    } 
} 
관련 문제