来自非 Java 背景,我发现自己编写了很多具有广泛功能的 View 类(为了便于移植),就维护而言,它们不一定很好地适合 Android FW 设置 - 对于例如,我可能有一个小部件,它会在某个时间间隔内执行某些操作,当 Activity 暂停/停止/销毁时,我想停止并清理它。通常我可以通过从包含 Activity 的小部件上调用公共(public)方法来管理它,但是 A) 有时这会变得很深,并且必须创建一个公共(public)方法来访问每个父级中的子级会变得丑陋,B) 需要额外(不需要?)关注。
我正在考虑使用像全局委托(delegate)这样的方法来管理这种事情,但是已经阅读了很多关于这种方法的警告——像下面的类这样的东西是否有我可能遗漏的任何固有缺陷?
import java.util.HashMap;
import java.util.HashSet;
public class ActiveRegistry {
private static final ActiveRegistry instance = new ActiveRegistry();
public static ActiveRegistry getInstance(){
return instance;
}
private HashMap<String, HashSet<Runnable>> registry = new HashMap<String, HashSet<Runnable>>();
private ActiveRegistry(){
}
public void register(String key, Runnable runnable){
if(!registry.containsKey(key)){
HashSet<Runnable> list = new HashSet<Runnable>();
registry.put(key, list);
}
HashSet<Runnable> list = registry.get(key);
list.add(runnable);
}
public void execute(String key){
if(registry.containsKey(key)){
HashSet<Runnable> list = registry.get(key);
for(Runnable runnable : list){
runnable.run();
}
}
}
}
使用可能类似于...
View
有一些东西需要清理。在实例化时,注册它...ActiveRegistry.getInstance().register("paused", someRunnableThatCleansUpStuff)
- 扩展
Activity
以便onPause
调用ActiveRegistry.getInstance().execute("paused");
最佳答案
您所做的工作比您需要的多得多。使用 Fragment
(来自 support package,如果您想确保与旧版本的 android 的向后兼容性),将使您的生活变得更加轻松。每个 fragment 都嵌入到一个 Activity 中,并具有与其宿主 Activity 的生命周期直接相关的生命周期。使用它们应该会显着降低代码的复杂性,因为您目前担心的大部分内容都将由系统管理。
关于java - 从 View (而不是 Activity )管理清理......单例模式的危险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10719065/