我正在尝试最大程度地减少需要设置严格模式的代码中的位置数量。但是我不确定我是否对以下内容是对的。

Android Strictmode的文档表示您可以将其用于应用程序,活动和其他组件。我读到,不希望扩展应用程序类,我不想扩展应用程序以启用严格模式。但是我认为我不必这样做。

您可以使用两种策略:ThreadPolicy(对于线程)和VMPolicy(对于所有线程)。因此,看来,如果我在线程上设置了一次strictup mode,那么我在何处就没关系,然后在该线程上报告违规行为,无论其他呼叫是否在strictmode上。我只需要从某个地方称呼它,然后才会发生违规行为。并且需要为在我的应用程序中创建的任何新线程设置,我也想检查。

我认为我想避免的是将build()方法拨打超出我的要求。将Strictmode放在开头 onCreate() 在我的所有活动中,这意味着build()将在该线程上多次被调用。如果我的应用程序中有一个启动器活动,请在该活动中设置strictmode onCreate() 对于其余的申请,应该足够。真的吗?

其次,如果我的主要活动即使应用程序没有死亡,我的主要活动也会重新启动,是否有必要再次致电Strictmode?还是我的线程仍在设置以报告违规行为?我以为在围绕严格模式的类包装类型的包装类型中可能会有一些价值:

public class MyStrictModeSettings {
    static private List<Long> setThreads = new ArrayList<Long>();

    // Prevent instantiation of this class
    private MyStrictModeSettings() {}

    static public synchronized void init() {
        try {
            Long tid = Thread.currentThread().getId();
            if(!setThreads.contains(tid)) {
                setThreads.add(tid);
                Class sMode = Class.forName("android.os.StrictMode");
                Method enableDefaults = sMode.getMethod("enableDefaults");
                enableDefaults.invoke(null);
            }
        }
        catch(Exception e) {
            // StrictMode not supported on this device, punt
            Log.v("StrictMode", "... not supported. Skipping...");
        }
    }
}

这样一来,在我的主要活动的onCreate()中,我可以简单地调用mystrictModesettings.init()并完成。它也应该在2.3之前使用Android版本。但这可能不值得。布拉德,你在吗?谢谢。

编辑: 由于VMPolicy适用于所有线程,因此从技术上讲,我只需要设置一次每个应用程序,对吗?因此,EnableDebaults()在被称为第二,第三等时间时正在浪费努力来重做VMPolicy?同样,也许尝试避免额外的电话比值得更多的麻烦。

有帮助吗?

解决方案

是的,vmpolicy用于整个过程,因此一次这样做就可以了。不过,更多的次数便宜,所以不要对此感到奇怪。

是的,您只需要在主/启动器活动的OnCreate()----与所有其他组件中进行此操作。

其他提示

查看源代码,您可以看到它在静态上被调用:

public static void setVmPolicy(final VmPolicy policy) {
    synchronized (StrictMode.class) {
        sVmPolicy = policy;
        sVmPolicyMask = policy.mask;
        setCloseGuardEnabled(vmClosableObjectLeaksEnabled());

        Looper looper = Looper.getMainLooper();
        if (looper != null) {
            MessageQueue mq = looper.mQueue;
            if (policy.classInstanceLimit.size() == 0 ||
                (sVmPolicyMask & VM_PENALTY_MASK) == 0) {
                mq.removeIdleHandler(sProcessIdleHandler);
                sIsIdlerRegistered = false;
            } else if (!sIsIdlerRegistered) {
                mq.addIdleHandler(sProcessIdleHandler);
                sIsIdlerRegistered = true;
            }
        }
    }
}

而且该策略本身也在静态上存储 - 同类中没有非静态成员变量。

    private static volatile VmPolicy sVmPolicy = VmPolicy.LAX;

这意味着您只需要在每个应用程序中进行一次执行操作,例如在应用程序的启动/输入活动中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top