关于安卓点击问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Jobin0528
V2EX    Android

关于安卓点击问题

  •  
  •   Jobin0528 2016-01-28 01:35:09 +08:00 12935 次点击
    这是一个创建于 3546 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用 nexus6 大半年了,发现一个很影响体验的问题,有很多 app ,可能有时候手贱就点了两遍,问题来了, ios 上点了一遍就没了只出现一个页面,而安卓却会出现两个同样页面,要点两次返回。
    不明白,求解释。
    怎么解决?
    21 条回复    2016-01-29 05:58:01 +08:00
    gengrui
        1
    gengrui  
       2016-01-28 06:09:35 +08:00
    因为在安卓里面的点击代码是:
    onClicked(View v) {
    switch(v.getId()) :
    case R.id.xx:
    startActivity(new Intent(this, AnotherActivity.class));
    }

    所以你会发现一旦 onclicked 执行了两次,那么 startActivity 就会被执行两次。

    iOS 里面是不是系统 handle 了这个 case ,还真不太了解 iOS 开发。

    不过在 android 里面,一般这种情况最好在开发的时候 handle 住,比如加个 loadingIndicator 或者判断两次点击 interval 之类的。
    jinhan13789
        2
    jinhan13789  
       2016-01-28 09:41:14 +08:00
    是你手快还是手机卡? 点击启动页面是需要一定的时间的,在此期间你又点击了一下~
    你试试系统自带的软件有没有这个问题,有的话就是你手快了。没有的话就是别的 app 开发者在点击事件里做了过多的计算,或者是页面切换动画时间不合理
    twoyuan
        3
    twoyuan  
       2016-01-28 09:46:04 +08:00
    在点击之后进行 setEnable(false),响应后进行 setEnable(true)
    lomoya
        4
    lomoya  
       2016-01-28 10:16:49 +08:00
    设置 launchMode 也会弹出两个 Activity 吗?
    Totato5749
        5
    Totato5749  
       2016-01-28 10:37:41 +08:00
    @twoyuan 对于 listview 这样的 onclickitem 还真没什么好办法

    我看过 RxJava 能屏蔽连续快速点击的

    总之是个好问题,现实使用中经常发生
    twoyuan
        6
    twoyuan  
       2016-01-28 10:44:47 +08:00
    @Totato5749

    onItemClick 或者 onClick 都会回调一个事件源 View ,用这个 setEnable 即可

    以时间为界限来防止连击的方法 Rx 那个解决方案不错,不过有些时候需要逻辑执行完毕或者出错才让 view 重新可以点击的时候就不是很好用了
    BillionWang
        7
    BillionWang  
       2016-01-28 10:58:08 +08:00
    写 app 的时候没做这个限定啦。
    rockyou12
        8
    rockyou12  
       2016-01-28 11:09:40 +08:00
    我写 app 一般都懒得判断拉,反正用户手贱多点两下一般也不会让 app 崩溃,而且手速这么快的用户真的很少……
    Totato5749
        9
    Totato5749  
       2016-01-28 11:12:40 +08:00
    @rockyou12 我觉得这经常发生。。。所以这问题很有探讨价值
    aliuwr
        10
    aliuwr  
       2016-01-28 11:34:56 +08:00
    @rockyou12 你过于高估了用户的手机性能。
    Jobin0528
        11
    Jobin0528  
    OP
       2016-01-28 11:44:51 +08:00
    @rockyou12 nexus 6 , 6.0.1 xposed +xp+绿守+阻止。真的不卡,我手也真的不快,不知道为什么有些 app 就会出现两遍,这的确不会导致崩溃,但这很影响用户体验!
    Jobin0528
        12
    Jobin0528  
    OP
       2016-01-28 11:47:23 +08:00
    不懂 ios 安卓编程,小白用户。
    只是想问下有没有什么插件或者 app 可以解决这个问题?
    Totato5749
        13
    Totato5749  
       2016-01-28 11:50:33 +08:00
    我认为原因是点击之后 startActivity 之前有太多工作,或者新的页面渲染时间太长,所以性能越差的机子复现这问题越容易
    rockyou12
        14
    rockyou12  
       2016-01-28 12:44:54 +08:00
    @Totato5749 应该只是手机性能或者代码写太长了,我写的时候一般 startIntent 前最多就 3,4 行,除了用 monkey 测试的时候基本没发现这种问题

    @Jobin0528 其实就是个消抖的问题,大学学硬件的时候就经常接触,这个东西软件硬件都要考虑。既然你的手机硬件已经这样了,除非是改驱动层面的东西不然很难解决
    mazyi
        15
    mazyi  
    PRO
       2016-01-28 13:06:21 +08:00
    @gengrui ios 同样有这样的问题, 4S 里的微信就经常会被我点出两个对话页面,要返回两次
    greenskinmonster
        16
    greenskinmonster  
       2016-01-28 13:07:09 +08:00
    一般需要开发者解决
    http://stackoverflow.com/a/20672997
    crystom
        17
    crystom  
       2016-01-28 13:40:00 +08:00
    @mazyi 同 4s ,我的网易云音乐之前也会卡成这样,但是一次更新之后似乎解决了
    Totato5749
        18
    Totato5749  
       2016-01-28 17:19:16 +08:00
    @greenskinmonster

    非常好的解决办法 不过有个问题 mLastClickTime=currentClickTime; 应该放在这个 if(elapsedTime<=MIN_CLICK_INTERVAL) return; 之后

    OnClickListener OnItemClickListener 都可用 很好!
    greenskinmonster
        19
    greenskinmonster  
       2016-01-28 17:34:45 +08:00
    @Totato5749 好像不应该改吧?
    假设用户 0ms 时点击一次,界面卡了, 500ms 又点击一次, 700ms 又点击一次。
    如果改了的话, 700ms 那次又触发了。
    nashxk
        20
    nashxk  
       2016-01-28 22:17:35 +08:00
    开发的时候加几句代码就好了。不过有时候嫌麻烦就不加了。
    gengrui
        21
    gengrui  
       2016-01-29 05:58:01 +08:00
    @mazyi 原来是这样,谢谢
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5414 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 40ms UTC 01:21 PVG 09:21 LAX 18:21 JFK 21:21
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86