Android - разбираемый объект разбирается в параметрах runOnUiThread () - PullRequest
0 голосов
/ 30 апреля 2019

Пожалуйста, пройдите все шаги,

Создан класс Actor, унаследованный с Runnable

public abstract class Actor implements Runnable {


Actor(int queueSize){ 
}

@Override
public void run() {
    onInit();
}
void onInit(){
    // do stuff here
}}

Затем я создаю класс MyRunner, используя Actor

class MyRunner extends Actor{

MyRunner() {
    super(10);
}}

Затем в своей деятельности я использую runOnUiThread, как показано ниже

Actor runner = new MyRunner();
runOnUiThread(runner);

Затем основной поток замораживается, весь экран становится черным, а приложение зависает.

Я использовал этот поток для реализации моего кода

Где я пропустил?

Ответы [ 2 ]

4 голосов
/ 30 апреля 2019

Это потому, что вы выполняете runnable на MainThread с runOnUiThread Вы должны запустить actor в фоновом потоке, позволить ему выполнить свою работу и опубликовать результат, когда вам нужно MainThread с помощью runOnUiThread или Handler

Например:

public abstract class Actor implements Runnable {

        Actor(int queueSize){ 
            // empty block
        }

        @Override
        public void run() {
            onInit();
            new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                        // hello ui i'm done with my job!!
                    }
                });
        }
        void onInit(){
            // do stuff here
        }
}

Создать Executor

private static final int POOL_SIZE_DEFAULT = 4;
private static final int POOL_SIZE_MAX = 10;
private static final int TIME_OUT = 30;

private ThreadPoolExecutor = mThreadPoolExecutor = new ThreadPoolExecutor(POOL_SIZE_DEFAULT,
                POOL_SIZE_MAX,
                TIME_OUT,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<Runnable>(POOL_SIZE_DEFAULT));

И execute ваш actor:

mThreadPoolExecutor.execute(runner);
0 голосов
/ 30 апреля 2019

Проблема была в том, что я неправильно использовал механизм runOnUiThread. В Android-разработке это объясняется очень хорошо.

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

runOnUiThread делает добавление в mainThread сообщения о том, что нам нужно выполнить во время выполнения, и это не должно быть долгим процессом, который может заморозить mainThread.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...