关于安卓点击问题

2016-01-28 01:35:09 +08:00
 Jobin0528
用 nexus6 大半年了,发现一个很影响体验的问题,有很多 app ,可能有时候手贱就点了两遍,问题来了, ios 上点了一遍就没了只出现一个页面,而安卓却会出现两个同样页面,要点两次返回。
不明白,求解释。
怎么解决?
10193 次点击
所在节点    Android
21 条回复
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
2016-01-28 09:41:14 +08:00
是你手快还是手机卡? 点击启动页面是需要一定的时间的,在此期间你又点击了一下~
你试试系统自带的软件有没有这个问题,有的话就是你手快了。没有的话就是别的 app 开发者在点击事件里做了过多的计算,或者是页面切换动画时间不合理
twoyuan
2016-01-28 09:46:04 +08:00
在点击之后进行 setEnable(false),响应后进行 setEnable(true)
lomoya
2016-01-28 10:16:49 +08:00
设置 launchMode 也会弹出两个 Activity 吗?
Totato5749
2016-01-28 10:37:41 +08:00
@twoyuan 对于 listview 这样的 onclickitem 还真没什么好办法

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

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

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

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

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

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

OnClickListener OnItemClickListener 都可用 很好!
greenskinmonster
2016-01-28 17:34:45 +08:00
@Totato5749 好像不应该改吧?
假设用户 0ms 时点击一次,界面卡了, 500ms 又点击一次, 700ms 又点击一次。
如果改了的话, 700ms 那次又触发了。
nashxk
2016-01-28 22:17:35 +08:00
开发的时候加几句代码就好了。不过有时候嫌麻烦就不加了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/253872

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX