CountDownTimer: «Невозможно создать обработчик внутри нити, который не назвал Looper.Prepare ()»

StackOverflow https://stackoverflow.com/questions/4006547

Вопрос

Я знаю, что общая проблема «не может создать обработчик внутри нити, которая не назвала Looper.Prepare ()», но я изо всех сил пытаюсь понять, как это относится в этом случае.

Я пытаюсь построить новый CoundDownTimer в ните не-пользовательского интерфейса, которую я думаю, является причиной этой ошибки, но я не понимаю, почему таймер должен будет использоваться в основном потоке. Из того, что я вижу, похоже, он имеет обработчик обратного вызова, который должен работать в потоке, который имеет петлитель, который не имеет по умолчанию нить неэй. Кажется, мои варианты: 1) Сделать эту нить не-пользовательского интерфейса иметь петлер или 2) сделать какой-то странный метод в моем пользовательском потоке, которая может построить этот таймер, оба, которые кажутся ко мне. Может кто-нибудь помочь мне понять последствия?

Кроме того, кто-нибудь знает о любых полезных ссылках, которые проливают свет на петлер и MessageQueue? Я не понимаю их хорошо, так как я уверен, что я показал. Спасибо!

Это было полезно?

Решение

Таймер не должен быть в потоке пользовательского интерфейса. Но я думаю, вы обновляете UI для отображения подсчета подсчет в этом потоке. Ю, не могу этого сделать.

Используйте Asynctask и обновите UI в onProgressUpdate

Другие советы

Экземпляр CountDownTimer должен быть создан на потоке UI.

Если у вас был объект пользовательского класса:

public class MyTimer extends CountDownTimer{
    public MyTimer(...){
         super(duration,interval);
    }
    //... other code ...//
}

Строительство объекта должно быть запущено в потоке UI

MyTimer mTimer = new MyTimer(...);   //can throw RuntimeException
                                    // with Looper.prepare() issue if
                                    // caller isn't UI thread

Если несколько потоков создают и уничтожают таймер, убедитесь, что он создан на ните UI, делая что-то подобное:

MyActivity.runOnUiThread( new Runnable(){
     public void run(){
          mTimer = new MyTimer(...);
     }
});

Но обратите внимание, как вышеуказанный сегмент кода требуется ссылка на вашу деятельность, а также к вариабельный MTIMER класса

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top