2011-04-25 8 views
2

안녕 얘들 아, 안드로이드 응용 프로그램에서 지연을 관리하는 방법을 알고 싶습니다. 예를 들어, onTextChanged() 메소드를 재정의했습니다. 이와 관련하여 사용자가 내 자동 완성 텍스트 상자에 입력하는 내용을 마무리하기 위해 0.5 초와 같은 지연을 설정하려고합니다. 사용자가 0.5 초 안에 타이핑을 멈추거나 멈추는 경우 내 코드 (예 : 내 자동 완성 텍스트 상자의 필터링 스키마/논리, 내 앱 내에서 리소스 사용량을 줄이기위한 것)에 특정 메소드 나 구현을 실행하고 싶습니다.android app에서 지연 관리

여기 내 예제 코드입니다 :

protected AutoCompleteTextView autoCompleteView; 
protected AutoCompleteAdapter suggsAdapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    countries = getResources().getStringArray(R.array.countries_array);  

    autoCompleteView = (AutoCompleteTextView) findViewById(R.id.autocomplete_country); 

    TextWatcher textChecker = new TextWatcher() { 
     @Override 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 

//here inside this overridden method, I wanted to create a delay in order to lessen the 
//use of resources. 

      String enteredText = autoCompleteView.getText().toString();    
      refreshList(enteredText); 

     } 
    };   


    autoCompleteView.addTextChangedListener(textChecker); 

} 

예를 들면

, 사용자는 "Lond는"("런던"와 같은 문자열) 각각의 문자로, 나는 미만 0.5 초를 원하는 입력 입력 이전의 모든 onTextChanged ("L", "o"및 "n"을 입력 할 때 호출되는) 메소드를 무시하고 마지막 문자가 입력되었을 때 onTextChanged()만이 실행되도록 부여됩니다.

내가 그렇게 할 것입니다 방법 트리거 될 때 onTextChanged()

답변

4

당신은 Handler 서브 클래스를 생성하고 Handler.sendEmptyMessageDelayed() 또는 Handler.sendMessageDelayed() 메서드를 호출 할 수 있습니다. :(도와주세요. 그리고 당신은 Handler.removeMessages()를 사용하여 메시지 큐에서 메시지를 제거 할 수 있습니다하시기 바랍니다. 당신을 .

mHandler.removeMessages(MESSAGE_TEXT_CHANGED); 
mHandler.sendEmptyMessage(MESSAGE_TEXT_CHANGED, 500); 

편집 : Handler.handleMessage() 방법으로 메시지를 처리한다 그래서 onTextChanged() 방법은 무엇인가있을 것입니다. 여기에 코드의 예 나는 그것을 테스트하지 않았습니다 아직, 나는 그것이 작동하는지 잘 모르겠다.

private static final int AUTOCOMPLETE_DELAY = 500; 
private static final int MESSAGE_TEXT_CHANGED = 0; 

private Handler mHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     if (msg.what == MESSAGE_TEXT_CHANGED) { 
      String enteredText = (String)msg.obj; 
      refreshList(enteredText); 
     } 
    } 
}; 

// ... your code here 

@Override 
public void onTextChanged(CharSequence s, int start, int before, int count) { 
    String enteredText = autoCompleteView.getText().toString();    
    mHandler.removeMessages(MESSAGE_TEXT_CHANGED); 
    final Message msg = Message.obtain(mHandler, MESSAGE_TEXT_CHANGED, enteredText); 
    mHandler.sendMessageDelayed(msg, AUTOCOMPLETE_DELAY); 
} 
+0

어떤 구체적인? 나는 안드로이드 개발에 새로운 오전. 그래서 내 코드에서 특정 코드 구현은 크게 감사하겠습니다. hehe : D – MarkJ

+0

답변에 구현 세부 정보를 추가했습니다. – Michael

+0

지금까지는 작동하지만, 어댑터의 비정상적인 동작처럼 Handler를 사용할 때 더 많은 문제가 있습니다. 어쩌면 UI를 사용하지 않고 백엔드 스레딩에 Handler를 사용하는 것이 좋습니다. :) – MarkJ

0

작성 중입니다. 자동 완성을위한 실행 코드입니다.

처음으로 onTextChanged이 호출됩니다.

 public void onTextChanged(CharSequence s, int start, int before, int count) { 
      String newText = s.toString(); 
      if(!newText.trim().equals("")) 
      Autocompletes_Timer(newText); 
     } 

이제 처리기가 필요합니다.

Hander handler = new Handler(); 
private void Autocompletes_Timer(final String newText) { 

    // new text will be here. so if you type fast within 1 sec. 
    // handler will be remover each time so that handler post delay also be remove. 
    if(handler!= null) 
     handler.removeCallbacksAndMessages(null); 

    // new text will be in runnable with 1 sec delay. 
    handler.postDelayed(runnable(newText), 1000); 
} 

    // it will be start work after 1 sec. 
    // if you stop the typing then it will complete work like as sending data at server. 
    // if you continue typing , it will not complete work and each type will be removeCallbackAndMessage. 
    private Runnable runnable(final String newText) { 
    Runnable runnable = new Runnable() { 

     @Override 
     public void run() { 

      Log.d("Autocompleted", newText); 

      // call AysncTask here 
     } 

    }; 
    return runnable; 
} 

내 코드를 복사하여 붙여 넣기 만하면됩니다. 문제를 해결해야합니다. 즐겨.

0

사용은 CountDownTimer

protected AutoCompleteTextView autoCompleteView; 
protected AutoCompleteAdapter suggsAdapter; 

String TAG = "Timer"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    countries = getResources().getStringArray(R.array.countries_array);  

    autoCompleteView = (AutoCompleteTextView) findViewById(R.id.autocomplete_country); 

    TextWatcher textChecker = new TextWatcher() { 

    CountDownTimer countDownTimer = new CountDownTimer(500,100) { 
      @Override 
      public void onTick(long millisUntilFinished) { 
       Log.d(TAG, "addressTextWatcher.countDownTimer.onTick() -> Tick: " + millisUntilFinished); 
      } 

      @Override 
      public void onFinish() { 
       Log.d(TAG, "addressTextWatcher.countDownTimer.onTick() -> Finish"); 

       String enteredText = autoCompleteView.getText().toString();    
       refreshList(enteredText); 
      } 
     }; 

     @Override 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      countDownTimer.cancel(); 

      countDownTimer.start(); 
     } 
    };   


    autoCompleteView.addTextChangedListener(textChecker); 

} 
관련 문제