2015-11-24 1 views
0

Я использую Android Studio и эмулятор Android 4.1.2. Мой кодandroid handler - нормально, таймер - к сожалению, остановлен. почему разница?

Timer timer = new Timer(); 
    timer.schedule(new TimerTask() { 
     @Override 
     public void run() { 
      myRun(); 
     } 
    },10000,10000); 

результат «к сожалению, приложение остановилось», однако я узнал код

Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     public void run() { 
      myRun(); 
     } 
    }, 2000); 

работает нормально, и показывает, как я ожидал. Какое внутреннее различие между этими двумя?

P.S.

public void myRun() { 
    myView.removeAllViews(); 
    drawView = new DrawView(myContext, myView); 
    myView.addView(drawView); 
} 

Я пытаюсь постоянно обновлять пользовательский вид до тех пор, пока пользователь не отменяет его. Просто цикл

while (myRun) { 

приводит эмулятор становится невосприимчива к выравниванию кнопки назад, работают это обновление во втором потоке

new Thread(new Runnable() { 
     @Override 
     public void run() { 
      while (myRun) { 

       myView.post(new Runnable() { 
        public void run() { 
         myView.removeAllViews(); 
         drawView = new DrawView(myContext, myView); 
         myView.addView(drawView); 
        } 
       }); 

      } 
     } 
    }).start(); 

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

+0

Сообщите, как выглядит журнал ошибок. – starkshang

ответ

0

Timer выполняет свои задачи в отдельном потоке, который используется только для обслуживания заданий, созданных этим конкретным таймером. Handler выполняет свою задачу в потоке Looper, который может быть или не быть потоком пользовательского интерфейса. Вообще говоря, нет большой разницы между этими двумя классами, если вы используете Handler в отдельном потоке. Но в Android более часто используется Handler и HandlerThread.

Если вам нужно взаимодействовать с пользовательским интерфейсом, вам лучше использовать Handler.

0

Это интересный вопрос, и ответ лежит в политике Thread/GUI, с которой следует андроид.

Как известно, пользовательский интерфейс работает по основной теме. Таймер создает другой поток, и андроид не позволяет обновлять пользовательский интерфейс в другом потоке. Зачем?

Предположим, вы начали поток в своей деятельности, который обновляет TextView, и пока поток работает, вы переходите в другое приложение. Теперь основной поток больше не существует, и когда другой поток пытается обновить TextView, он не может найти этот TextView. В результате мы видим крах.

Теперь позвольте мне прийти к разнице между TimerTask и Handler.

TimerTask создает новый поток, ждет указанное время и затем выполняет метод run() в том же потоке. С другой стороны, Handler создает новый поток, ждет указанной продолжительности, затем возвращается в основной поток и выполняет метод run() в MAIN thread (если обработчик находится в основном потоке). Следовательно, он работает нормально.

Однако вы можете сделать это и с таймером. Смотрите код ниже:

final Runnable setRunnable = new Runnable() { 
    public void run() { 
     myView.removeAllViews(); 
     drawView = new DrawView(myContext, myView); 
     myView.addView(drawView); 
    } 
}; 

TimerTask task = new TimerTask(){ 
    public void run() { 
     getActivity().runOnUiThread(setRunnable); 
    } 
}; 

Timer timer = new Timer(); 
timer.schedule(task, 1000); 

В этой теме вы устанавливаете исполняемый для запуска на UI потоке после того, как длительность таймера.

+0

большое спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^