кнопка запуска и остановки в Android

#android #android-asynctask

#Android #android-asynctask

Вопрос:

Эй, ребята, я разрабатываю одно приложение, в котором я запускаюсь во время выполнения lop в asycTask нажатием кнопки, и я хочу остановить эту задачу нажатием другой кнопки, например start и stop, но проблема в том, что как только запускается цикл while, он не прослушивает никаких других событий, как будто блокирует поток пользовательского интерфейса, что мне делать?

Комментарии:

1. С какой целью запускать цикл while? Она блокирует не поток пользовательского интерфейса, а поток AsyncTask.

2. привет, Владимир, я дал код, пожалуйста, проверьте

Ответ №1:

Вам нужно проверить isCancelled, чтобы узнать, был ли ваш AsyncTask отменен.

В вашем цикле while :

 if (isCancelled()) {
    break;
}
  

Таким образом, вы не застряли в этом цикле на неопределенный срок.

Комментарии:

1. это не работает в принципе, он не прослушивает кнопку whle во время выполнения цикла

2. В каком методе используется ваш цикл while?

3. по сути, цикл while находится внутри асинхронной задачи, и я вызываю другой класс, который я объявил отдельно. я объявил объект этого класса в activity и инициализировал его в oncreate

4. В каком методе вашей пользовательской AsyncTask она используется? Она должна быть в doInBackground или в методе, вызываемом doInBackground . Не могли бы вы опубликовать свой код?

Ответ №2:

Вы могли бы попробовать следующее:

  1. Когда вы нажимаете кнопку Stop, установите логическое значение ivar (мы будем называть его isStopped) = true
  2. В функции onProgressUpdate вашей AsyncTask проверьте статус isStopped. Если это true, выйдите из цикла while.

Для этого вам нужно будет сохранить ссылку на вашу активность внутри вашей AsyncTask, поэтому создайте для нее конструктор, который принимает объект типа вашей активности.

Комментарии:

1. isCancelled предоставляет boolean вам, и while цикл, вероятно, находится в doInBackground и нет onProgressUpdate .

2. Да, ему пришлось бы сохранить локальную переменную и установить ее = isStopped внутри onProgressUpdate, чтобы сделать то, о чем я говорил. Не знал, что ваш способ существует. Это определенно лучший способ сделать это.

Ответ №3:

Я думаю, что именно так вам нужно это реализовать:

Объявите это в своем activity, чтобы оно было доступно из OnClickListener

 onGoingTask ex;
  

А затем в вашем onCreate вставьте этот код, где StartButton и stopButton являются кнопками в вашем приложении

 startButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        ex.doInBackground();
        ex = new ReloadHistoryTask();
        ex.execute();
    }
});
stopButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        ex.cancel(true);
    }
});
  

Затем, ниже, в том же файле, у вас будет объявление вашей AsyncTask

 private class onGoingTask extends AsyncTask<Void, Void, Long[]> {
    @Override
    protected Long[] doInBackground(Void... params) {
        Long[] myCount = {0L, 0L, 0L};
        while(sflag==0) {    
            System.out.println("in while");
            //code for gps data collection
            myCount[2]  ;
        }
        return myCount;
    }
}
  

Я думаю, что что-то подобное должно сработать для вас, вы можете удалить массив Long[], если он вам не нужен, я просто оставил его там, потому что я им пользуюсь, и я подумал, что это может быть удобно для вас ‘ 🙂

Комментарии:

1. Привет, Джаред, я уже сделал это, но моя проблема в том, что когда я нажимаю кнопку «Пуск», она начинает собирать данные, но затем она не прослушивает нажатие другой кнопки, весь пользовательский интерфейс зависает во время сбора данных

2. Как вы думаете, может быть, вы могли бы опубликовать свой код, чтобы я мог лучше видеть, в чем проблема? На самом деле, если вы просто прослушиваете координаты GPS и т.д., Для этого не должен требоваться цикл while, это должно быть больше похоже на LocationListener(), который вызывается при возврате данных. Затем, когда вы закончите сбор данных, вы можете вызвать что-то вроде mSensorManager.unregisterListener(this); // Удалите прослушиватель, который вы ранее добавили LocationManager.removeUpdates(LocationListener);

Ответ №4:

Попробуйте использовать AsyncTask.cancel() .