Skip to content

Commit 4be9c86

Browse files
committed
优化内存回收机制
1 parent 3006599 commit 4be9c86

File tree

6 files changed

+38
-27
lines changed

6 files changed

+38
-27
lines changed

README.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@
44
55
> 博客地址:[悬浮窗需求终结者](https://www.jianshu.com/p/247d705b87b6)
66
7-
> 已投入公司项目多时,没有任何毛病,可胜任任何需求,[点击此处下载Demo](https://raw.githubusercontent.com/getActivity/XToast/master/XToast.apk)
8-
9-
> 想了解实现原理的可以点击此链接查看:[XToast](https://github.com/getActivity/XToast/blob/master/library/src/main/java/com/hjq/xtoast/XToast.java) 源码
7+
> 已投入公司项目多时,没有任何毛病,可胜任任何需求,[点击此处下载Demo](XToast.apk)
108
119
![](XToast.gif)
1210

XToast.apk

111 KB
Binary file not shown.

app/build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ android {
77
applicationId "com.hjq.xtoast.demo"
88
minSdkVersion 14
99
targetSdkVersion 28
10-
versionCode 53
11-
versionName "5.3"
10+
versionCode 55
11+
versionName "5.5"
1212
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
1313
}
1414
buildTypes {
@@ -33,5 +33,5 @@ dependencies {
3333
// 吐司工具类:https://github.com/getActivity/ToastUtils
3434
implementation 'com.hjq:toast:8.2'
3535
// 内存泄漏捕捉:https://github.com/square/leakcanary
36-
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.2'
36+
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.4'
3737
}

library/build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,16 @@ android {
77
defaultConfig {
88
minSdkVersion 14
99
targetSdkVersion 26
10-
versionCode 53
11-
versionName "5.3"
10+
versionCode 55
11+
versionName "5.5"
1212
}
1313
}
1414

1515
publish {
1616
userOrg = 'getactivity'
1717
groupId = 'com.hjq'
1818
artifactId = 'xtoast'
19-
version = '5.3'
19+
version = '5.5'
2020
description = 'This is a simple and easy to use suspension window frame'
2121
website = "https://github.com/getActivity/XToast"
2222
}

library/src/main/java/com/hjq/xtoast/ToastLifecycle.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,11 @@ public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}
6060
@Override
6161
public void onActivityDestroyed(Activity activity) {
6262
if (mActivity == activity) {
63-
mToast = null;
6463
mActivity = null;
64+
if (mToast != null) {
65+
mToast.recycle();
66+
mToast = null;
67+
}
6568
}
6669
}
6770
}

library/src/main/java/com/hjq/xtoast/XToast.java

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -54,23 +54,6 @@ public class XToast<X extends XToast> {
5454
/** 吐司显示和取消监听 */
5555
private OnToastListener mListener;
5656

57-
private XToast(Context context) {
58-
mContext = context;
59-
mWindowManager = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE));
60-
// 配置一些默认的参数
61-
mWindowParams = new WindowManager.LayoutParams();
62-
mWindowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
63-
mWindowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
64-
mWindowParams.format = PixelFormat.TRANSLUCENT;
65-
mWindowParams.windowAnimations = android.R.style.Animation_Toast;
66-
mWindowParams.packageName = context.getPackageName();
67-
// 开启窗口常亮和设置可以触摸外层布局(除 WindowManager 外的布局,默认是 WindowManager 显示的时候外层不可触摸)
68-
// 需要注意的是设置了 FLAG_NOT_TOUCH_MODAL 必须要设置 FLAG_NOT_FOCUSABLE,否则就会导致用户按返回键无效
69-
mWindowParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
70-
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
71-
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
72-
}
73-
7457
/**
7558
* 创建一个局部悬浮窗
7659
*/
@@ -101,6 +84,23 @@ public XToast(Application application) {
10184
}
10285
}
10386

87+
private XToast(Context context) {
88+
mContext = context;
89+
mWindowManager = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE));
90+
// 配置一些默认的参数
91+
mWindowParams = new WindowManager.LayoutParams();
92+
mWindowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
93+
mWindowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
94+
mWindowParams.format = PixelFormat.TRANSLUCENT;
95+
mWindowParams.windowAnimations = android.R.style.Animation_Toast;
96+
mWindowParams.packageName = context.getPackageName();
97+
// 开启窗口常亮和设置可以触摸外层布局(除 WindowManager 外的布局,默认是 WindowManager 显示的时候外层不可触摸)
98+
// 需要注意的是设置了 FLAG_NOT_TOUCH_MODAL 必须要设置 FLAG_NOT_FOCUSABLE,否则就会导致用户按返回键无效
99+
mWindowParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
100+
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
101+
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
102+
}
103+
104104
/**
105105
* 是否有这个标志位
106106
*/
@@ -406,6 +406,16 @@ public void update() {
406406
mWindowManager.updateViewLayout(mRootView, mWindowParams);
407407
}
408408

409+
/**
410+
* 回收
411+
*/
412+
public void recycle() {
413+
mContext = null;
414+
mWindowManager = null;
415+
mListener = null;
416+
mDraggable = null;
417+
}
418+
409419
/**
410420
* 当前是否已经显示
411421
*/

0 commit comments

Comments
 (0)