主要的Ui冻结

时间:2017-08-01 15:14:05

标签: android multithreading kotlin freeze

我试图以不同的速度眨眼相机。

所以要做到这一点我使用搜索栏来改变闪烁的速度。

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

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

    }

但它会冻结主用户界面,所以现在我无法使用搜索栏更改值并获取ANR消息。 我该怎么办?我不能使用asynkTask。 服务也不是一个好选择。我认为。

1 个答案:

答案 0 :(得分:0)

尽量不要使用单独的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);
    }
}