????????在刚刚开发完成的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; }
|