2015-10-18 4 views
0

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

У нас есть задача Async, которая принимает три параметра. Параметр прогресса (т. Е. Второй параметр) является Runnable.

@Override 
 
    public void onProgressUpdate(Runnable ...runnableCommands) { 
 
     // TODO -- you fill in here with the appropriate call to 
 
     // the runnableCommands that will cause the progress 
 
     // update to be displayed in the UI thread. 
 
    }

Я могу делать звонки с помощью этого метода publishProgress() в doInBackGround() метод.

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

Может кто-то направить меня лучший способ сделать это, чем создать обработчик

+0

Я никогда не пробовал, но, пожалуйста, попробуйте runOnUiThread (Runnable action). http://stackoverflow.com/questions/12316838/is-using-runonuithread-inside-asynctask-inefficient-and-bad –

ответ

1

Если у вас есть ссылка деятельности, простой способ использует метод runOnUiThread(Runnable runnable). Глядя на исходный код, это очень легко понять, почему:

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

Если у вас есть ссылка только на вид, вы можете использовать метод post(Runnable runnable).

JavaDoc для обоих состояний Runnable будет выполняться в основном потоке.

+0

'onProgressUpdate' работает в потоке пользовательского интерфейса. –

0

Согласно документации

onProgressUpdate

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

Вы можете найти ссылку здесь AsyncTask

В основном этот метод уже работает в потоке пользовательского интерфейса. Поэтому вам не нужен какой-либо дополнительный код (через handelrs или runOnUiThread()).

В вашем случае вы можете просто позвонить по телефону run этого Runnable.

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