2013-05-07 2 views
4

Я немного испортил метод runOnUiThread. И если я просто сделаю метод в своей деятельности:Android Java runOnUiThread()

public void Test() 
{ 
    runOnUiThread(new Runnable() 
    { 
     public void run() 
     { 
      Log.v("mainActivity", "test"); 
     } 
    });  
} 

Я заметил, что этот runnable работает только один раз. Однако это не проблема. Мне было интересно, если я полностью пропустил что-то, и он что-то делает в фоновом режиме, что приведет к снижению частоты кадров, когда я выполнил этот метод пару раз.

ответ

12

Это полное тело от Activity.runOnUiThread(Runnable):

public final void runOnUiThread(Runnable action) { 
    if (Thread.currentThread() != mUiThread) { 
     mHandler.post(action); 
    } else { 
     action.run(); 
    } 
} 

Тело метод все еще выполняется в вашем фоновом потоке, и mHandler класса android.os.Handler реализует внутреннюю очередь для Runnables отправил к нему, так что если вы не делая блокирующую работу в Runnable (которая является big no-no в потоке пользовательского интерфейса) или вызывая этот метод более тысячи раз за короткий период, вы не должны видеть никакой разницы.

Теперь, если вы звонили Handler.postAtFrontOfQueue(Runnable), тогда возникла проблема, потому что ваш Runnable по существу «режет в линию». В этом случае это может вызвать заикание, потому что ваш Runnable выполняется вместо любых обновлений пользовательского интерфейса, которые должны были выполняться (например, прокрутки).

Обратите внимание, что вы только необходимость для запуска обновления пользовательского интерфейса в потоке пользовательского интерфейса, как вызов любых методов на View (отсюда название «UI нить» и почему этот метод существует) или какой-либо операции, где документация четко указано, что его нужно запускать в потоке пользовательского интерфейса. В противном случае, если вы уже находитесь в фоновом потоке, нет никакой реальной причины оставить его.

+0

Выполняет ли mHandler Activity только работу с потоком пользовательского интерфейса? – likejiujitsu

+0

@likejiujitsu Этот конкретный экземпляр Handler, да. Вот для чего это. Вы можете посмотреть, как настроить Handler для другого потока здесь: http://developer.android.com/reference/android/os/Looper.html –

1

Маловероятно, что это приведет к существенному прерыванию вашего пользовательского интерфейса, но нет смысла запускать его в потоке пользовательского интерфейса.

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

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