Skip to content

Commit 34257a3

Browse files
committed
处理dialog对象的维护管理类
1 parent 6ffcf0e commit 34257a3

File tree

8 files changed

+216
-173
lines changed

8 files changed

+216
-173
lines changed

app/build.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,6 @@ dependencies {
5353
compile project(path: ':dialog')
5454
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
5555
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
56-
compile 'com.github.tianzhijiexian:logger:1.1.9'
57-
compile 'com.jakewharton.timber:timber:4.5.1'
56+
compile 'com.github.hss01248:Mylog:1.0.1'
57+
compile 'com.alibaba:fastjson:1.1.54.android'
5858
}

app/src/main/java/com/hss01248/dialogutildemo/BaseApp.java

+11-12
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
import android.app.Activity;
44
import android.app.Application;
55
import android.os.Bundle;
6-
import android.util.Log;
76

7+
import com.alibaba.fastjson.JSON;
88
import com.hss01248.dialog.ActivityStackManager;
9+
import com.hss01248.dialog.DialogsMaintainer;
910
import com.hss01248.dialog.StyledDialog;
10-
import com.orhanobut.logger.LogPrintStyle;
11-
import com.orhanobut.logger.Logger;
12-
import com.orhanobut.logger.Settings;
11+
import com.orhanobut.logger.Jsonfy;
12+
import com.orhanobut.logger.XLogUtil;
1313
import com.squareup.leakcanary.LeakCanary;
1414

1515
/**
@@ -29,14 +29,12 @@ public void onCreate() {
2929
}
3030

3131
private void initlog() {
32-
Logger.initialize(
33-
new Settings()
34-
.setStyle(new LogPrintStyle())
35-
.isShowMethodLink(true)
36-
.isShowThreadInfo(false)
37-
.setMethodOffset(0)
38-
.setLogPriority(BuildConfig.DEBUG ? Log.VERBOSE : Log.ASSERT)
39-
);
32+
XLogUtil.init(true, "dialog", new Jsonfy() {
33+
@Override
34+
public String toJson(Object o) {
35+
return JSON.toJSONString(o);
36+
}
37+
});
4038
}
4139

4240
private void registCallback() {
@@ -57,6 +55,7 @@ public void onActivityResumed(Activity activity) {
5755

5856
@Override
5957
public void onActivityPaused(Activity activity) {
58+
DialogsMaintainer.onPause(activity);
6059

6160
}
6261

app/src/main/java/com/hss01248/dialogutildemo/MainActivity.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ public void onClick(View view) {
234234
testBadToken();
235235
break;
236236
case R.id.btn_dismiss:
237-
StyledDialog.dismissLoading();
237+
StyledDialog.dismissLoading(this);
238238
break;
239239
case R.id.btn_common_progress:
240240
final Dialog[] dialog00 = new Dialog[1];

dialog/src/main/java/com/hss01248/dialog/DialogsMaintainer.java

+109-55
Original file line numberDiff line numberDiff line change
@@ -3,123 +3,177 @@
33
import android.app.Activity;
44
import android.app.Dialog;
55
import android.content.Context;
6-
import android.content.DialogInterface;
76

8-
import java.util.ArrayList;
97
import java.util.HashMap;
8+
import java.util.HashSet;
109
import java.util.Iterator;
11-
import java.util.List;
12-
import java.util.ListIterator;
10+
import java.util.Map;
11+
import java.util.Set;
1312

1413
/**
1514
* Created by hss on 2018/3/24.
1615
*/
1716

1817
public class DialogsMaintainer {
1918

20-
private static HashMap<Activity,List<Dialog>> dialogsOfActivity = new HashMap<>();
21-
private static List<Dialog> loadingDialogs = new ArrayList<>();
19+
private static HashMap<Activity, Set<Dialog>> dialogsOfActivity = new HashMap<>();
20+
private static HashMap<Activity, Set<Dialog>> loadingDialogs = new HashMap<>();
2221

2322

23+
public static void addLoadingDialog(Context context, Dialog dialog) {
2424

25-
public static void addLoadingDialog(Dialog dialog){
26-
if(dialog.getOwnerActivity() instanceof Activity){
27-
loadingDialogs.add(dialog);
25+
if (!(context instanceof Activity)) {
26+
return;
27+
}
28+
Activity activity = (Activity) context;
29+
30+
Set<Dialog> dialogs = null;
31+
if (loadingDialogs.containsKey(activity)) {
32+
dialogs = loadingDialogs.get(activity);
33+
}
34+
if (dialogs == null) {
35+
dialogs = new HashSet<>();
36+
loadingDialogs.put(activity, dialogs);
2837
}
38+
dialogs.add(dialog);
39+
2940

3041
}
3142

32-
public static void dismissLoading(Activity activity){
33-
if(activity ==null){
43+
public static void dismissLoading(Activity activity) {
44+
45+
if (activity == null) {
3446
return;
3547
}
36-
ListIterator<Dialog> iterator = loadingDialogs.listIterator();
37-
while (iterator.hasNext()){
38-
Dialog dialog = iterator.next();
39-
if(dialog.getOwnerActivity().equals(activity)){
40-
dialog.dismiss();
41-
iterator.remove();
42-
removeWhenDismiss(dialog);
48+
if (!loadingDialogs.containsKey(activity)) {
49+
return;
50+
}
51+
Set<Dialog> dialogSet = loadingDialogs.get(activity);
52+
for (Dialog dialog : dialogSet) {
53+
dialog.dismiss();
54+
//在callback内部自动会去移除在dialogsOfActivity的引用
55+
}
56+
loadingDialogs.remove(activity);
57+
58+
}
59+
60+
public static void dismissLoading(Dialog dialog) {
61+
Iterator<Map.Entry<Activity, Set<Dialog>>> entryIterator = loadingDialogs.entrySet().iterator();
62+
while (entryIterator.hasNext()) {
63+
Map.Entry<Activity, Set<Dialog>> entry = entryIterator.next();
64+
Set<Dialog> dialogInterfaces = entry.getValue();
65+
if (dialogInterfaces == null || dialogInterfaces.isEmpty()) {
66+
entryIterator.remove();
67+
return;
68+
}
69+
Iterator<Dialog> iterator = dialogInterfaces.iterator();
70+
while (iterator.hasNext()) {
71+
Dialog dialog0 = iterator.next();
72+
if (dialog.equals(dialog0)) {
73+
iterator.remove();
74+
}
75+
}
76+
if (dialogInterfaces == null || dialogInterfaces.isEmpty()) {
77+
entryIterator.remove();
78+
return;
4379
}
4480
}
4581
}
4682

47-
public static void addWhenShow(Dialog dialog){
83+
public static void addWhenShow(Context context, Dialog dialog) {
4884

49-
Activity activity = dialog.getOwnerActivity();
50-
if(activity ==null){
85+
if (!(context instanceof Activity)) {
5186
return;
5287
}
53-
List<Dialog> dialogs = null;
54-
if(dialogsOfActivity.containsKey(activity)){
88+
89+
Activity activity = (Activity) context;
90+
91+
Set<Dialog> dialogs = null;
92+
if (dialogsOfActivity.containsKey(activity)) {
5593
dialogs = dialogsOfActivity.get(activity);
5694
}
57-
if(dialogs == null){
58-
dialogs = new ArrayList<>();
59-
dialogsOfActivity.put(activity,dialogs);
95+
if (dialogs == null) {
96+
dialogs = new HashSet<>();
97+
dialogsOfActivity.put(activity, dialogs);
6098
}
6199
dialogs.add(dialog);
100+
62101
}
63102

64-
public static void removeWhenDismiss(Dialog dialog){
65-
Activity activity = dialog.getOwnerActivity();
66-
if(activity ==null){
67-
return;
68-
}
69-
if(!dialogsOfActivity.containsKey(activity)){
70-
return;
71-
}
72-
List<Dialog> dialogInterfaces = dialogsOfActivity.get(activity);
73-
if(dialogInterfaces==null || dialogInterfaces.isEmpty()){
74-
return;
75-
}
76-
ListIterator<Dialog> iterator = dialogInterfaces.listIterator();
77-
while (iterator.hasNext()){
78-
Dialog dialog0 = iterator.next();
79-
if(dialog.equals(dialog0)){
80-
iterator.remove();
103+
public static void removeWhenDismiss(Dialog dialog) {
104+
105+
try {
106+
Iterator<Map.Entry<Activity, Set<Dialog>>> entryIterator = dialogsOfActivity.entrySet().iterator();
107+
while (entryIterator.hasNext()) {
108+
Map.Entry<Activity, Set<Dialog>> entry = entryIterator.next();
109+
Set<Dialog> dialogInterfaces = entry.getValue();
110+
if (dialogInterfaces == null || dialogInterfaces.isEmpty()) {
111+
entryIterator.remove();
112+
return;
113+
}
114+
Iterator<Dialog> iterator = dialogInterfaces.iterator();
115+
while (iterator.hasNext()) {
116+
Dialog dialog0 = iterator.next();
117+
if (dialog.equals(dialog0)) {
118+
iterator.remove();
119+
}
120+
}
121+
if (dialogInterfaces == null || dialogInterfaces.isEmpty()) {
122+
entryIterator.remove();
123+
return;
124+
}
81125
}
126+
} catch (Exception e) {
127+
e.printStackTrace();
82128
}
83129

130+
84131
}
85132

86133
/**
87134
* 在这里移除已经dismiss的dialog引用
135+
*
88136
* @param activity
89137
*/
90-
public static void onPause(Activity activity){
91-
if(!dialogsOfActivity.containsKey(activity)){
138+
public static void onPause(Activity activity) {
139+
if (!dialogsOfActivity.containsKey(activity)) {
92140
return;
93141
}
94-
List<Dialog> dialogInterfaces = dialogsOfActivity.get(activity);
95-
if(dialogInterfaces==null || dialogInterfaces.isEmpty()){
142+
Set<Dialog> dialogInterfaces = dialogsOfActivity.get(activity);
143+
if (dialogInterfaces == null || dialogInterfaces.isEmpty()) {
96144
dialogInterfaces.remove(activity);
97145
return;
98146
}
99-
ListIterator<Dialog> iterator = dialogInterfaces.listIterator();
100-
while (iterator.hasNext()){
147+
Iterator<Dialog> iterator = dialogInterfaces.iterator();
148+
while (iterator.hasNext()) {
101149
Dialog dialog = iterator.next();
102-
if(!dialog.isShowing()){
150+
if (!dialog.isShowing()) {
103151
iterator.remove();
104152
}
105153
}
154+
if (dialogInterfaces == null || dialogInterfaces.isEmpty()) {
155+
dialogInterfaces.remove(activity);
156+
return;
157+
}
106158

107159
}
108160

109-
public static void onDestory(Activity activity){
110-
if(!dialogsOfActivity.containsKey(activity)){
161+
public static void onDestory(Activity activity) {
162+
163+
if (!dialogsOfActivity.containsKey(activity)) {
111164
return;
112165
}
113-
List<Dialog> dialogInterfaces = dialogsOfActivity.get(activity);
114-
if(dialogInterfaces==null || dialogInterfaces.isEmpty()){
166+
Set<Dialog> dialogInterfaces = dialogsOfActivity.get(activity);
167+
if (dialogInterfaces == null || dialogInterfaces.isEmpty()) {
115168
dialogInterfaces.remove(activity);
116169
return;
117170
}
118171
for (Dialog dialog : dialogInterfaces) {
119-
if(dialog!=null){
172+
if (dialog != null && dialog.isShowing()) {
120173
dialog.dismiss();
121174
}
122175
}
123176
dialogInterfaces.remove(activity);
177+
124178
}
125179
}

0 commit comments

Comments
 (0)