【问题标题】:Main Ui Freezes主界面冻结
【发布时间】:2017-08-01 15:14:05
【问题描述】:

我正在尝试以不同的速度闪烁摄像头。

为此,我使用搜索栏来更改闪烁速度。

当我第一次更改 seekbar 的值时,它开始闪烁

private fun startFlashLightBlink(context: Context,blinkSpeed: Int) {

        isBlinkFlashLight=true
     flashLightBlinkThread = Thread{

                Looper.prepare()
                while (isBlinkFlashLight){
                    val blinkInterval:Long=blinkSpeed*100L
                    //getMainLooper() handler is associated "with the Looper for the current thread" ... which is currently the main(UI) thread
                    val handler = Handler()

                    var runnable:Runnable = Runnable{
                        toggleFlashLight()
                    }
                    handler.postDelayed(runnable,blinkInterval)
                }

                Looper.loop()

            }
            flashLightBlinkThread?.start()

    }

但它冻结了主 UI,所以现在我无法使用 seekbar 更改值并收到 ANR 消息。 我该怎么办?我不能使用异步任务。 服务也不是一个好的选择。我认为。

【问题讨论】:

    标签: android multithreading kotlin freeze


    【解决方案1】:

    尽量不要使用单独的 Thread 和 Looper。处理程序足以完成您想做的事情。像这样循环:

    private static final long POST_DELAY = 100;
    private final Handler handler = new Handler();
    private final Runnable cycleRunnable = new Runnable() {
        public void run() {
            if (isCycling) {
                // make your cycle body here
                handler.postDelayed(cycleRunnable, POST_DELAY);
            }
        }
    };
    
    private boolean isCycling = false;
    
    public void startCycle() {
        if (!isCycling) {
            isCycling = true;
            handler.postDelayed(cycleRunnable, POST_DELAY);
        }
    }
    
    public void stopCycle() {
        if (isCycling) {
            isCycling = false;
            handler.removeCallbacks(cycleRunnable);
        }
    }
    

    【讨论】:

    • 第 6 行有错误,即 handler.postDelayed(cycleRunnable, POST_DELAY); cycleRunnable 变量放置错误。它不能在里面。
    • 是的,当然。修复它
    • 它只运行一次,但我想无限运行直到用户不取消它。
    • 我不知道您的代码在 java 中运行良好,但在 kotlin 中运行良好。顺便说一句,非常感谢。
    猜你喜欢
    • 2013-04-05
    • 1970-01-01
    • 2014-05-05
    • 2016-07-22
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    相关资源
    最近更新 更多