Я новичок в Android и пытаюсь использовать UI-Thread, поэтому я написал простое тестовое задание. Но я думаю, что что-то неправильно понял, потому что при нажатии на кнопку - приложение больше не отвечает
public class TestActivity extends Activity {
Button btn;
int i = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button)findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
runThread();
}
});
}
private void runThread(){
runOnUiThread (new Thread(new Runnable() {
public void run() {
while(i++ < 1000){
btn.setText("#"+i);
try {
Thread.sleep(300);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}));
}
}
Просто оберните его как функцию, затем вызовите эту функцию из фонового потока.
источник
final
)У вас есть это задом наперед. Ваше нажатие кнопки приводит к вызову
runOnUiThread()
, но в этом нет необходимости, поскольку обработчик щелчков уже запущен в потоке пользовательского интерфейса. Затем ваш кодrunOnUiThread()
запускает новый фоновый поток, в котором вы пытаетесь выполнить операции пользовательского интерфейса, которые затем не выполняются.Вместо этого просто запустите фоновый поток прямо из вашего обработчика кликов. Затем оберните звонки
btn.setText()
внутри звонкаrunOnUiThread()
.источник
runOnUiThread()
не нужен, но он должен быть безвредным. Javadoc для этого метода говорит: «Запускает указанное действие в потоке пользовательского интерфейса. Если текущий поток является потоком пользовательского интерфейса, то действие выполняется немедленно. Если текущий поток не является потоком пользовательского интерфейса, действие публикуется в очереди событий. пользовательского интерфейса. "источник
Существует несколько методов использования runOnUiThread (), позволяет увидеть все
Это мой основной поток (поток пользовательского интерфейса) под названием AndroidBasicThreadActivity, и я собираюсь обновить его из рабочего потока различными способами -
1.) Передав экземпляр Activity в качестве аргумента в рабочий поток
2.) С помощью метода представления Post (Runnable runnable) в рабочем потоке
3.) Используя класс Handler из пакета android.os. Если у нас нет контекста (this / getApplicationContext ()) или экземпляра Activity (AndroidBasicThreadActivity.this), мы должны использовать класс Handler, как показано ниже:
источник
Если вы используете фрагмент, просто напишите
источник
твое это:
источник
Мы используем Worker Thread, чтобы сделать приложения более плавными и избегать ANR. Возможно, нам придется обновить пользовательский интерфейс после тяжелого процесса в рабочем Tread. Пользовательский интерфейс может быть обновлен только из потока пользовательского интерфейса. В таких случаях мы используем Handler или runOnUiThread, и оба имеют метод runnable run, который выполняется в потоке пользовательского интерфейса. Метод onClick выполняется в потоке пользовательского интерфейса, поэтому здесь не нужно использовать runOnUiThread.
Использование Kotlin
В то время как в деятельности,
Из фрагмента,
Используя Java ,
источник
Вы можете использовать из этого образца:
В следующем примере мы собираемся использовать эту возможность для публикации результата поиска по синониму, который был обработан фоновым потоком.
Для достижения цели во время обратного вызова действия OnCreate мы настроим onClickListener для запуска searchTask в созданном потоке.
Когда пользователь нажимает кнопку «Поиск», мы создаем анонимный класс Runnable, который ищет слово, набранное в R.id.wordEt EditText, и запускает поток для выполнения Runnable.
Когда поиск завершится, мы создадим экземпляр Runnable SetSynonymResult, чтобы опубликовать результат обратно в синониме TextView через поток пользовательского интерфейса.
Этот метод иногда не самый удобный, особенно когда у нас нет доступа к экземпляру Activity; поэтому в следующих главах мы обсудим более простые и понятные методы обновления пользовательского интерфейса из задачи фоновых вычислений.
Источник :
Асинхронное программирование Android Helder Vasconcelos
источник
Вот как я это использую:
источник
источник
Попробуй это:
getActivity().runOnUiThread(new Runnable...
Это потому что:
1) неявное this в вашем вызове runOnUiThread относится к AsyncTask , а не к вашему фрагменту.
2) Фрагмент не имеет runOnUiThread.
Тем не менее, активность делает.
Обратите внимание, что Activity просто выполняет Runnable, если вы уже находитесь в главном потоке, в противном случае он использует обработчик. Вы можете реализовать обработчик в своем фрагменте, если вы не хотите беспокоиться о контексте этого, на самом деле это очень просто:
// Экземпляр класса
// где-нибудь еще в вашем коде
// ^ это всегда будет выполняться при следующем цикле выполнения в главном потоке.
источник