Skip to content

Commit 39fdd7d

Browse files
committed
修复 Toast 没有跟随 Activity 生命周期的问题
1 parent 0786946 commit 39fdd7d

File tree

7 files changed

+40
-33
lines changed

7 files changed

+40
-33
lines changed

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
# 吐司工具类
22

3+
> 码云地址:[Gitee](https://gitee.com/getActivity/ToastUtils)
4+
35
> 博客地址:[只需体验三分钟,你就会跟我一样,爱上这款Toast](https://www.jianshu.com/p/9b174ee2c571)
46
5-
> 已投入公司项目多时,没有任何毛病,可胜任任何需求,[点击此处下载Demo](https://raw.githubusercontent.com/getActivity/ToastUtils/master/ToastUtils.apk)
7+
> 已投入公司项目多时,没有任何毛病,可胜任任何需求,[点击此处下载Demo](ToastUtils.apk)
68
79
> 想了解实现原理的可以点击此链接查看:[ToastUtils](https://github.com/getActivity/ToastUtils/blob/master/library/src/main/java/com/hjq/toast/ToastUtils.java) 源码
810
@@ -13,7 +15,7 @@
1315
#### 集成步骤
1416

1517
dependencies {
16-
implementation 'com.hjq:toast:8.2'
18+
implementation 'com.hjq:toast:8.3'
1719
}
1820

1921
#### 初始化 Toast

ToastUtils.apk

-76.5 KB
Binary file not shown.

app/build.gradle

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ android {
77
applicationId "com.hjq.toast.demo"
88
minSdkVersion 14
99
targetSdkVersion 28
10-
versionCode 82
11-
versionName "8.2"
10+
versionCode 83
11+
versionName "8.3"
1212
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
1313
}
1414
buildTypes {
@@ -26,7 +26,7 @@ dependencies {
2626
// 标题栏:https://github.com/getActivity/TitleBar
2727
implementation 'com.hjq:titlebar:6.0'
2828
// 悬浮窗:https://github.com/getActivity/XToast
29-
implementation 'com.hjq:xtoast:5.0'
29+
implementation 'com.hjq:xtoast:5.5'
3030
// 内存泄漏捕捉:https://github.com/square/leakcanary
31-
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.2'
31+
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.4'
3232
}

app/src/main/java/com/hjq/toast/demo/ToastApplication.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public boolean intercept(Toast toast, CharSequence text) {
2727
if (intercept) {
2828
Log.e("Toast", "空 Toast");
2929
} else {
30-
Log.i("Toast", text.toString());
30+
Log.d("Toast", text.toString());
3131
}
3232
return intercept;
3333
}

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 3
99
targetSdkVersion 26
10-
versionCode 82
11-
versionName "8.2"
10+
versionCode 83
11+
versionName "8.3"
1212
}
1313
}
1414

1515
publish {
1616
userOrg = 'getactivity'
1717
groupId = 'com.hjq'
1818
artifactId = 'toast'
19-
version = '8.2'
19+
version = '8.3'
2020
description = 'This is a very functional Toast'
2121
website = "https://github.com/getActivity/ToastUtils"
2222
}

library/src/main/java/com/hjq/toast/ToastHelper.java

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.hjq.toast;
22

3+
import android.app.Activity;
34
import android.app.Application;
5+
import android.content.Context;
46
import android.graphics.PixelFormat;
57
import android.os.Handler;
68
import android.os.Looper;
@@ -95,16 +97,24 @@ void show() {
9597
params.y = mToast.getYOffset();
9698

9799
try {
98-
// 如果这个 View 对象被重复添加到 WindowManager 则会抛出异常
99-
// java.lang.IllegalStateException:
100-
// View android.widget.TextView has already been added to the window manager.
101-
mWindowHelper.getWindowManager().addView(mToast.getView(), params);
100+
Activity topActivity = mWindowHelper.getTopActivity();
101+
if (topActivity != null && !topActivity.isFinishing()) {
102+
WindowManager windowManager = (WindowManager) topActivity.getSystemService(Context.WINDOW_SERVICE);
103+
if (windowManager != null) {
104+
windowManager.addView(mToast.getView(), params);
105+
}
106+
}
102107
// 添加一个移除吐司的任务
103108
sendEmptyMessageDelayed(hashCode(), mToast.getDuration() == Toast.LENGTH_LONG ?
104109
IToastStrategy.LONG_DURATION_TIMEOUT : IToastStrategy.SHORT_DURATION_TIMEOUT);
105110
// 当前已经显示
106111
setShow(true);
107-
} catch (NullPointerException | IllegalStateException | WindowManager.BadTokenException ignored) {}
112+
} catch (IllegalStateException | WindowManager.BadTokenException ignored) {
113+
// 如果这个 View 对象被重复添加到 WindowManager 则会抛出异常
114+
// java.lang.IllegalStateException: View android.widget.TextView has already been added to the window manager.
115+
// 如果 WindowManager 绑定的 Activity 已经销毁,则会抛出异常
116+
// android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@ef1ccb6 is not valid; is your activity running?
117+
}
108118
}
109119
}
110120

@@ -116,11 +126,17 @@ void cancel() {
116126
removeMessages(hashCode());
117127
if (isShow()) {
118128
try {
129+
Activity topActivity = mWindowHelper.getTopActivity();
130+
if (topActivity != null) {
131+
WindowManager windowManager = (WindowManager) topActivity.getSystemService(Context.WINDOW_SERVICE);
132+
if (windowManager != null) {
133+
windowManager.removeViewImmediate(mToast.getView());
134+
}
135+
}
136+
} catch (IllegalArgumentException ignored) {
119137
// 如果当前 WindowManager 没有附加这个 View 则会抛出异常
120-
// java.lang.IllegalArgumentException:
121-
// View=android.widget.TextView not attached to window manager
122-
mWindowHelper.getWindowManager().removeViewImmediate(mToast.getView());
123-
} catch (NullPointerException | IllegalArgumentException ignored) {}
138+
// java.lang.IllegalArgumentException: View=android.widget.TextView not attached to window manager
139+
}
124140
// 当前没有显示
125141
setShow(false);
126142
}

library/src/main/java/com/hjq/toast/WindowHelper.java

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,8 @@
33
import android.annotation.TargetApi;
44
import android.app.Activity;
55
import android.app.Application;
6-
import android.content.Context;
76
import android.os.Build;
87
import android.os.Bundle;
9-
import android.view.WindowManager;
108

119
/**
1210
* author : Android 轮子哥
@@ -34,19 +32,10 @@ static WindowHelper register(ToastHelper toast, Application application) {
3432
}
3533

3634
/**
37-
* 获取一个WindowManager对象
38-
*
39-
* @return 如果获取不到则抛出空指针异常
35+
* 获取栈顶的 Activity
4036
*/
41-
WindowManager getWindowManager() throws NullPointerException {
42-
// 如果使用的 WindowManager 对象不是当前 Activity 创建的,则会抛出异常
43-
// android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
44-
// 如果使用的 WindowManager 对象的 Activity 已经销毁,则会抛出异常
45-
// WindowManager: android.view.WindowLeaked: Activity has leaked window TextView that was originally added here
46-
if (mTopActivity != null && !mTopActivity.isFinishing()) {
47-
return ((WindowManager) mTopActivity.getSystemService(Context.WINDOW_SERVICE));
48-
}
49-
throw new NullPointerException();
37+
Activity getTopActivity() {
38+
return mTopActivity;
5039
}
5140

5241
/**

0 commit comments

Comments
 (0)