Управление задержками в приложении для Android - PullRequest
2 голосов
/ 25 апреля 2011

Эй, ребята, я хотел бы знать, как управлять задержками в приложении для Android, например, у меня есть переопределенный метод onTextChanged (). В связи с этим я хочу установить задержку, например, 0,5 секунды, чтобы завершить то, что пользователь печатает в моем текстовом поле автозаполнения. Если пользователь зависает / перестает печатать в течение 5 секунд, я хотел, чтобы в моем коде выполнялся определенный метод или реализация (т.е. моя собственная схема / логика фильтрации в моем текстовом поле автозаполнения, просто чтобы уменьшить использование ресурсов в моем приложении, спасибо).

Вот мой пример кода:

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» (для String, например, «London»), причем каждая буква набирается менее чем за 0,5 секунды. Я хочу, чтобы все предыдущие методы onTextChanged () вызывались (вызов метода при наборе «L», "o" и "n") игнорируются, и только onTextChanged (), когда была набрана последняя буква, будут предоставлены для выполнения.

Как бы я это сделал, пожалуйста, помогите мне: (.

Ответы [ 3 ]

4 голосов
/ 25 апреля 2011

Вы можете создать подкласс Handler и вызывать метод Handler.sendEmptyMessageDelayed() или Handler.sendMessageDelayed() при срабатывании onTextChanged().И вы можете удалить сообщения из очереди сообщений, используя Handler.removeMessages().Вы должны обрабатывать сообщения методом Handler.handleMessage().Таким образом, ваш метод onTextChanged() будет выглядеть примерно так:

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

EDIT : вот пример кода.Я еще не тестировал его, поэтому не уверен, что он работает.

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 голосов
/ 10 марта 2015

использовать 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);

}
0 голосов
/ 29 августа 2014

Я пишу код для автозаполнения.

Сначала будет вызван 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;
}

просто скопируйте и вставьте мой код.Это должно быть исправить вашу проблему.Наслаждайтесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...