在刚刚开发完成的Flutter TV app中,遇到过好多个棘手的问题,最后都迎刃而解了。正好有空就一个个总结出来。
第一个问题:如何处理flutter TV 按键过快?
机顶盒app开发中,内存问题首要考虑的,因为大多数的机顶盒内存较低,它们的Ram在2G以下,特别是很多内存1G, 500M的盒子。app在这种盒子上运行时动不动就闪退,着实令人头疼。
由于硬件内存的限制,用遥控器切换app页面时,速度会很慢,偶尔还会发生ANR,这种情况下如果不控制遥控器的接收按键速度,flutter widget 不停切换或者刷新,ANR和闪退的几率会非常高。
那么如何控制flutter widget的按键速度呢?
我们知道Android activity的所有按键响应都是可以在 dispatchKeyEvent()方法里,FlutterActivity 也不例外,所有遥控器的按键拦截都可以在这个方法中进行。在flutter app的这个方法,我们要拦截两类按键,一是拦截重复按键, 二是拦截按键过快。
所以最终的处理代码如下:
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if(event.getRepeatCount() > 0) { //拦截重复按键
return true;
}
if(event.getAction() == KeyEvent.ACTION_DOWN) {
if(isFastClick()) { // 拦截与前一次按键间隔太短的按键
return true;
}
}
// TODO Auto-generated method stub
return super.dispatchKeyEvent(event);
}
private static final int MIN_CLICK_DELAY_TIME = 400; //ms,两次有效按键之间的最小间隔时间
private static long lastClickTime;
public static boolean isFastClick() {
boolean flag = false;
long curClickTime = System.currentTimeMillis();
if ((curClickTime - lastClickTime) <= MIN_CLICK_DELAY_TIME) {
flag = true;
}
lastClickTime = curClickTime;
return flag;
}