从视图(而不是活动)管理清理......单例模式的危险?

时间:2012-05-23 11:32:37

标签: java android android-fragments

来自非Java背景,我发现自己编写了许多具有广泛功能的View类(为了便携),在维护时不一定非常适合Android FW设置 - 例如,我可能有一个小部件在我想要停止的时间间隔内执行某些操作,并在暂停/停止/销毁活动时进行清理。通常我可以通过从包含Activity调用窗口小部件上的公共方法来管理它,但是A)有时这会非常深入,并且必须创建一个公共方法来访问每个父项中的子项可能会变得丑陋,并且B)要求额外的(没有注意力的)注意力。

我正在考虑使用类似全局委托的方法来管理这类事情,但是已经阅读了很多关于这种方法的警告 - 类似下面的类会有任何我可能会遗漏的固有缺陷?

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();
            }
        }
    }
}

使用可能类似......

  1. View有一些需要清理的东西。在实例化时,注册它...... ActiveRegistry.getInstance().register("paused", someRunnableThatCleansUpStuff)
  2. 扩展Activity以便onPause来电ActiveRegistry.getInstance().execute("paused");

1 个答案:

答案 0 :(得分:0)

你正在做的工作超出了你的需要。使用Fragment s(来自support package,如果你想确保向后兼容旧版本的android),将使你的生活变得更加容易。每个片段都嵌入在一个活动中,其生命周期与其主机活动的生命周期直接相关。使用它们可以显着降低代码的复杂性,因为您当前担心的大部分内容都将由系统管理。