【问题标题】:Android - Runnable object parse into runOnUiThread() paramsAndroid - 可运行对象解析为 runOnUiThread() 参数
【发布时间】:2019-04-30 08:00:36
【问题描述】:

请完成这些步骤,

创建了用 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);

然后主线程死机,全屏黑屏,app死机。

我使用this thread 来实现我的代码

我错过了什么?

【问题讨论】:

  • 您正在通过 runOnUiThread 在主线程上运行代码,它解释了“冻结”。您需要创建一个线程并在其中交付您的可运行文件。线程(mRunnable).start()

标签: java android multithreading android-runonuithread


【解决方案1】:

这是因为你在 MainThread 上执行 runnablerunOnUiThread 你应该在后台线程中运行你的 actor,让它完成它的工作并在你需要 MainThread 和 @ 时发布它的结果987654326@或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);

【讨论】:

    【解决方案2】:

    问题是我错误地使用了runOnUiThread 机制。 在Android develop 中解释得很好。

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

    runOnUiThread 正在做的是在mainThread 中添加一条消息,说明我们需要在运行时执行什么,它不应该是一个可以冻结mainThread 的漫长过程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 2019-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      相关资源
      最近更新 更多