Android GUI :: Непрерывные события нажатия - PullRequest
0 голосов
/ 23 февраля 2011

Hello У меня есть одна кнопка ImageButton с одним изображением. Я добавил событие onclick, и обычно оно работает нормально. Когда нажимается кнопка Image, моя функция добавления ввода работает.

Теперь, когда пользователь постоянно нажимает на мою кнопку с изображением, функции «Добавить запись» выполняются много раз с одними и теми же данными. Я хочу предотвратить это. Таким образом, Imagebutton не должен стоять в очереди для обработки следующего события щелчка, пока моя функция не будет выполнена полностью.

Я попытался myImageButton.setEnable(false), как только будет выполнено событие OnClick. И делает

myImageButton.setEnable(true) после моей функции ввода данных.

Я также пытался поместить этот код в myImageButton.isEnabled(), но он не работал.

Как игнорировать такие события щелчков в очереди? Есть ли другой способ (setEnable()) игнорировать / обрабатывать обработку кликов?

Я установил в println операторы, что каждое событие нажатия синхронизировано ... означает, что весь код выполняется по порядку.

EDIT

   private OnClickListener m_AddClickHandler = new OnClickListener()
    {
        public void onClick(View v)
        {
            if(m_bDoAdd)
            {
                m_bDoAdd = false;
                new AddTask().execute();
            }
            else
                logData("Add::OnClick::not clicked");
        }
    };
private class AddTask extends AsyncTask<Void, Void, Integer> 
    {
        @Override
        protected Integer doInBackground(Void... params) 
        {
            logData("doinbg, start"+m_bDoAdd);
            int iStatus =Add(m_data);
            logData("doinbg, start end, status="+iStatus+"flag="+m_bDoAdd);
            return iStatus;
        }

        @Override
        protected void onPostExecute(Integer result) 
        {
            logData("onpostExec, start"+m_bDoAdd);
            int iStatus = result;
            if (iStatus == 0)
            {
                Toast.makeText(getApplicationContext(), R.string.strAdded, Toast.LENGTH_SHORT).show();
            }
            else if (iStatus == 1)
            {
                Toast.makeText(getApplicationContext(), R.string.strAlreadyExists, Toast.LENGTH_SHORT).show();
            }
            else
            {
                Toast.makeText(getApplicationContext(), R.string.strAddFailed, Toast.LENGTH_SHORT).show();
            }

            m_bDoAdd = true;
            logData("onpostExec, end"+m_bDoAdd);
        }
    }

    void Add()
    {
       // Add info to db (takes few msecs)
    }

Я все еще не получаю сообщение "Add :: OnClick :: not clicked" в журнале.

Есть еще какие-нибудь подсказки?

Ответы [ 3 ]

1 голос
/ 23 февраля 2011

Попробуйте это внутри обработчика onClick:

myImageButton.setClickable(false);

Обновление:

Это , как события работают в Android :

  1. Когда пользователь щелкает по представлению, событие добавляется в очередь событий.
  2. События обрабатываются в EDT последовательно: одно за другим.
  3. Постановка в очередь событий и диспетчеризация событийвыполняется в отдельных потоках: обработка события не препятствует добавлению нового события в очередь.

Решение вашей проблемы:

  1. Вы должны обрабатывать события как можно быстрее ине блокировать EDT.Это означает, что вы должны выполнять все длительные задачи (= операции с базой данных) в фоновом потоке - для этого используйте AsyncTask.
  2. Когда вы запускаете фоновую задачу, вам нужно установить флаг (backgroundWorkRunning) и очиститькогда закончите.
  3. Когда отправляется новое событие, сначала проверьте флаг backgroundWorkRunning.Ничего не делать, если флаг уже установлен.
1 голос
/ 23 февраля 2011

Может быть, вы можете использовать глобальный флаг, такой как логическая переменная, для которой по умолчанию установлено значение false, а когда оно равно false, выполняется функция ввода addd. при входе в функцию установите флаг в значение true. Надеюсь, это поможет.

0 голосов
/ 23 февраля 2011

вы можете использовать статическую логическую переменную, которую вы установили в true при обработке события щелчка.когда вы нажимаете на эту кнопку, отметьте ее как истинное, а также примените блок if, который проверяет, является ли переменная истинной или нет.когда ваша задача выполнена, и поток кода собирается существовать в onClickListener, вы можете снова установить для этой логической переменной значение false.

...