【现象】
在Storage中点击Files选项,会弹出Files,若有多个Files则会弹出选择框(GMS版本)。
但当连续快速点击Files时,则会出现不显示弹框的假象。
停止点击后,会出现大量弹窗,消耗的资源也很大,可能导致卡死。
甚至在连续快速点击的过程中就出现卡死。
【原因】
系统弹出选择框需要时间,当弹框出现后,下一次点击事件会被弹框拦截掉,这样是正常的处理流程。
但当连续点击的间隔小于此时间时,系统在持续接受点击事件并响应,导致大量弹窗正在弹出的路上,同时部分弹窗还没完全显现就被dismiss,看起来就是没出现过弹窗。
【解决方案】
增加点击事件防抖,即增加连点时间间隔判断,不响应短间隔的连续点击。
修改如下:
+++ b/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
@@ -101,6 +101,11 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle
private static final String AUTHORITY_MEDIA = "com.android.providers.media.documents";
+ /// START. 不响应短时连续点击。By XShawn@20211227.
+ private Preference lastPrefs = null;
+ private long lastPrefsClickTime = 0;
+ /// END. 不响应短时连续点击。By XShawn@20211227.
+
public StorageItemPreferenceController(
Context context, Fragment hostFragment, VolumeInfo volume, StorageVolumeProvider svp) {
super(context);
@@ -136,6 +141,18 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle
if (preference.getKey() == null) {
return false;
}
+
+ /// START. 不响应短时连续点击。By XShawn@20211227.
+ long currTime = System.currentTimeMillis();
+ if (lastPrefs == preference && currTime - lastPrefsClickTime <= 1000) {
+ lastPrefs = preference;
+ lastPrefsClickTime = currTime;
+ return false;
+ }
+ lastPrefs = preference;
+ lastPrefsClickTime = currTime;
+ /// END. 不响应短时连续点击。By XShawn@20211227.
+
switch (preference.getKey()) {
case PHOTO_KEY:
intent = getPhotosIntent();