Android-Runnable对象解析为runOnUiThread()参数

时间:2019-04-30 08:00:37

标签: java android multithreading android-runonuithread

请按照以下步骤操作

使用Runnable继承的Actor类创建

public abstract class Actor implements Runnable {


Actor(int queueSize){ 
}

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

然后我使用Actor创建MyRunner类

class MyRunner extends Actor{

MyRunner() {
    super(10);
}}

然后在我的活动中,按如下方式使用runOnUiThread

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

然后,主线程冻结,整个屏幕为黑色,应用程序被冻结。

我用this thread来实现我的代码

我错过了哪里?

2 个答案:

答案 0 :(得分:4)

这是因为您正在runnable上在MainThread上执行runOnUiThread,应该在后台线程中运行actor,让它完成工作并在以下情况下发布结果您需要用MainThreadrunOnUiThreadHandler

例如:

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);

答案 1 :(得分:0)

问题是我没有正确使用runOnUiThread机制。 在Android develop中,它解释得很好。

  

在UI线程上运行指定的操作。如果当前线程是UI线程,则立即执行该操作。如果当前线程不是UI线程,则将操作发布到UI线程的事件队列。

runOnUiThread所做的是向mainThread中添加一条消息,指出我们需要在运行时执行什么,并且这不应是一个冻结mainThread的漫长过程。