2011-01-16 3 views
4

StrictMode를 설정해야하는 코드의 수를 최소화하려고합니다. 그러나 나는 옳은지 아닌지 잘 모르겠다.Android StrictMode의 수명주기는 어떻게됩니까?

Android StrictMode의 설명서에는 애플리케이션, 활동 및 기타 구성 요소에 사용할 수 있다고 나와 있습니다. Application 클래스를 확장하는 것은 바람직하지 않으며 StrictMode를 사용하도록 응용 프로그램을 확장하지 않는 것이 좋습니다. 그러나 나는해야한다고 생각하지 않는다.

사용할 수있는 정책은 ThreadPolicy (스레드 용)와 VmPolicy (모든 스레드 용)입니다. 따라서 StrictMode를 한 번 쓰레드에 설정하면, 그 일을하는 곳에서 문제가되지 않으며 StrictMode에 상관없이 다른 쓰레드에 상관없이 그 쓰레드에서 위반이보고 될 것입니다. 나는 탐지하고자하는 위반이 일어나기 전에 어딘가에서 그것을 호출 할 필요가있다. 또한 응용 프로그램에서 작성한 새로운 스레드를 확인하기 위해 설정해야합니다.

내가 피하고 싶은 생각은 build() 메소드를 필요한 것보다 많이 호출하는 것입니다. 모든 활동에서 onCreate()의 시작 부분에 StrictMode를 넣으면 build()가 해당 스레드에서 두 번 이상 호출 될 것입니다. 내 응용 프로그램에 Launcher 활동이 하나있는 경우 해당 활동의 onCreate()에 StrictMode를 설정하면 나머지 응용 프로그램에 충분합니다. 그게 사실이야?

두 번째로 응용 프로그램이 죽지 않아도 내 주 활동이 다시 시작되면 기술적으로 StrictMode를 다시 호출해야합니까? 아니면 내 스레드가 여전히 위반 사항을보고하도록 설정되어 있습니까? 내가 지금처럼 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 이전의 안드로이드 버전에서도 잘 작동 할 것입니다. 그러나 그만한 가치는 없을 것입니다. 브래드, 거기 있니? 감사.

편집 : VmPolicy는 모든 스레드 용이므로 기술적으로는 응용 프로그램 당 한 번만 설정하면됩니다. 맞습니까? 따라서 enableDefaults()는 VmPolicy가 두 번째, 세 번째 등의 시간에 호출 될 때 다시 실행하기위한 노력을 낭비하고 있습니까? 다시 말하지만, 여분의 전화를 피하려고 노력하는 것보다 더 많은 어려움이있을 수 있습니다.

답변

7

예, 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; 
      } 
     } 
    } 
} 

을 그리고 정책 자체가 정적으로 저장 - 클래스에는 비 정적 멤버 변수가없는 : 소스 코드를 보면

2

, 당신은 정적으로 호출되는 것을 볼 수 있습니다.

private static volatile VmPolicy sVmPolicy = VmPolicy.LAX; 

이것은 응용 프로그램의 실행/입력 활동과 같이 응용 프로그램마다 한 번만 수행해야한다는 것을 의미합니다.

관련 문제