Skip to content

Commit 75653c8

Browse files
committed
优化: 使用位运算对适配信息的缓存进行优化
1 parent b76b39f commit 75653c8

File tree

3 files changed

+38
-15
lines changed

3 files changed

+38
-15
lines changed

autosize/src/main/java/me/jessyan/autosize/AutoSize.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,10 @@
2323
import android.content.res.Resources;
2424
import android.net.Uri;
2525
import android.util.DisplayMetrics;
26+
import android.util.SparseArray;
2627
import android.view.View;
2728

2829
import java.util.Locale;
29-
import java.util.Map;
30-
import java.util.concurrent.ConcurrentHashMap;
3130

3231
import me.jessyan.autosize.external.ExternalAdaptInfo;
3332
import me.jessyan.autosize.external.ExternalAdaptManager;
@@ -51,7 +50,11 @@
5150
* ================================================
5251
*/
5352
public final class AutoSize {
54-
private static Map<String, DisplayMetricsInfo> mCache = new ConcurrentHashMap<>();
53+
private static SparseArray<DisplayMetricsInfo> mCache = new SparseArray<>();
54+
private static final int MODE_SHIFT = 30;
55+
private static final int MODE_MASK = 0x3 << MODE_SHIFT;
56+
private static final int MODE_ON_WIDTH = 1 << MODE_SHIFT;
57+
private static final int MODE_DEVICE_SIZE = 2 << MODE_SHIFT;
5558

5659
private AutoSize() {
5760
throw new IllegalStateException("you can't instantiate me!");
@@ -172,17 +175,18 @@ public static void autoConvertDensityBaseOnHeight(Activity activity, float desig
172175
*/
173176
public static void autoConvertDensity(Activity activity, float sizeInDp, boolean isBaseOnWidth) {
174177
Preconditions.checkNotNull(activity, "activity == null");
178+
Preconditions.checkMainThread();
175179

176180
float subunitsDesignSize = isBaseOnWidth ? AutoSizeConfig.getInstance().getUnitsManager().getDesignWidth()
177181
: AutoSizeConfig.getInstance().getUnitsManager().getDesignHeight();
178182
subunitsDesignSize = subunitsDesignSize > 0 ? subunitsDesignSize : sizeInDp;
179183

180184
int screenSize = isBaseOnWidth ? AutoSizeConfig.getInstance().getScreenWidth()
181185
: AutoSizeConfig.getInstance().getScreenHeight();
182-
String key = sizeInDp + "|" + subunitsDesignSize + "|" + isBaseOnWidth + "|"
183-
+ AutoSizeConfig.getInstance().isUseDeviceSize() + "|"
184-
+ AutoSizeConfig.getInstance().getInitScaledDensity() + "|"
185-
+ screenSize;
186+
187+
int key = Math.round(sizeInDp + subunitsDesignSize + AutoSizeConfig.getInstance().getInitScaledDensity() + screenSize) & ~MODE_MASK;
188+
key = isBaseOnWidth ? (key | MODE_ON_WIDTH) : (key & ~MODE_ON_WIDTH);
189+
key = AutoSizeConfig.getInstance().isUseDeviceSize() ? (key | MODE_DEVICE_SIZE) : (key & ~MODE_DEVICE_SIZE);
186190

187191
DisplayMetricsInfo displayMetricsInfo = mCache.get(key);
188192

@@ -242,6 +246,7 @@ public static void autoConvertDensity(Activity activity, float sizeInDp, boolean
242246
* @param activity {@link Activity}
243247
*/
244248
public static void cancelAdapt(Activity activity) {
249+
Preconditions.checkMainThread();
245250
float initXdpi = AutoSizeConfig.getInstance().getInitXdpi();
246251
switch (AutoSizeConfig.getInstance().getUnitsManager().getSupportSubunits()) {
247252
case PT:

autosize/src/main/java/me/jessyan/autosize/AutoSizeCompat.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@
1919
import android.content.res.Configuration;
2020
import android.content.res.Resources;
2121
import android.util.DisplayMetrics;
22-
23-
import java.util.Map;
24-
import java.util.concurrent.ConcurrentHashMap;
22+
import android.util.SparseArray;
2523

2624
import me.jessyan.autosize.external.ExternalAdaptInfo;
2725
import me.jessyan.autosize.external.ExternalAdaptManager;
@@ -39,7 +37,11 @@
3937
* ================================================
4038
*/
4139
public final class AutoSizeCompat {
42-
private static Map<String, DisplayMetricsInfo> mCache = new ConcurrentHashMap<>();
40+
private static SparseArray<DisplayMetricsInfo> mCache = new SparseArray<>();
41+
private static final int MODE_SHIFT = 30;
42+
private static final int MODE_MASK = 0x3 << MODE_SHIFT;
43+
private static final int MODE_ON_WIDTH = 1 << MODE_SHIFT;
44+
private static final int MODE_DEVICE_SIZE = 2 << MODE_SHIFT;
4345

4446
private AutoSizeCompat() {
4547
throw new IllegalStateException("you can't instantiate me!");
@@ -134,17 +136,18 @@ public static void autoConvertDensityBaseOnHeight(Resources resources, float des
134136
*/
135137
public static void autoConvertDensity(Resources resources, float sizeInDp, boolean isBaseOnWidth) {
136138
Preconditions.checkNotNull(resources, "resources == null");
139+
Preconditions.checkMainThread();
137140

138141
float subunitsDesignSize = isBaseOnWidth ? AutoSizeConfig.getInstance().getUnitsManager().getDesignWidth()
139142
: AutoSizeConfig.getInstance().getUnitsManager().getDesignHeight();
140143
subunitsDesignSize = subunitsDesignSize > 0 ? subunitsDesignSize : sizeInDp;
141144

142145
int screenSize = isBaseOnWidth ? AutoSizeConfig.getInstance().getScreenWidth()
143146
: AutoSizeConfig.getInstance().getScreenHeight();
144-
String key = sizeInDp + "|" + subunitsDesignSize + "|" + isBaseOnWidth + "|"
145-
+ AutoSizeConfig.getInstance().isUseDeviceSize() + "|"
146-
+ AutoSizeConfig.getInstance().getInitScaledDensity() + "|"
147-
+ screenSize;
147+
148+
int key = Math.round(sizeInDp + subunitsDesignSize + AutoSizeConfig.getInstance().getInitScaledDensity() + screenSize) & ~MODE_MASK;
149+
key = isBaseOnWidth ? (key | MODE_ON_WIDTH) : (key & ~MODE_ON_WIDTH);
150+
key = AutoSizeConfig.getInstance().isUseDeviceSize() ? (key | MODE_DEVICE_SIZE) : (key & ~MODE_DEVICE_SIZE);
148151

149152
DisplayMetricsInfo displayMetricsInfo = mCache.get(key);
150153

@@ -199,6 +202,7 @@ public static void autoConvertDensity(Resources resources, float sizeInDp, boole
199202
* @param resources {@link Resources}
200203
*/
201204
public static void cancelAdapt(Resources resources) {
205+
Preconditions.checkMainThread();
202206
float initXdpi = AutoSizeConfig.getInstance().getInitXdpi();
203207
switch (AutoSizeConfig.getInstance().getUnitsManager().getSupportSubunits()) {
204208
case PT:

autosize/src/main/java/me/jessyan/autosize/utils/Preconditions.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package me.jessyan.autosize.utils;
1717

18+
import android.os.Looper;
19+
1820
/**
1921
* ================================================
2022
* Created by JessYan on 26/09/2016 13:59
@@ -100,6 +102,18 @@ public static int checkElementIndex(int index, int size, String desc) {
100102
}
101103
}
102104

105+
/**
106+
* Throws {@link IllegalStateException} if the calling thread is not the application's main
107+
* thread.
108+
*
109+
* @throws IllegalStateException If the calling thread is not the application's main thread.
110+
*/
111+
public static void checkMainThread() {
112+
if (Looper.myLooper() != Looper.getMainLooper()) {
113+
throw new IllegalStateException("Not in applications main thread");
114+
}
115+
}
116+
103117
private static String badElementIndex(int index, int size, String desc) {
104118
if (index < 0) {
105119
return format("%s (%s) must not be negative", new Object[]{desc, Integer.valueOf(index)});

0 commit comments

Comments
 (0)