V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Jobin0528
V2EX  ›  Android

关于安卓点击问题

  •  
  •   Jobin0528 · 2016-01-28 01:35:09 +08:00 · 10180 次点击
    这是一个创建于 3247 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用 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  
       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   ·   实用小工具   ·   1838 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 16:21 · PVG 00:21 · LAX 08:21 · JFK 11:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.