더 나은 점 : @SuppressLint 또는 @TargetApi?


100

내 앱에 문제가 있으며 StrictMode기본적으로 StrictModeHelper. 그러나 Lint는 setThreadPolicy()지금 에 대해 불평 하고 다음 중 하나를 추가 할 것을 제안합니다.

@SuppressLint 'NewApi'

또는

@TargetApi(Build.VERSION_CODES.GINGERBREAD)

onCreate()보기 의 이벤트에.

어떤 방법이 선호됩니까 .. 또는 기본적으로 동일한 작업을 수행합니까?

답변:


176

내 앱에 StrictMode에 관한 문제가 있으며 기본적으로 StrictModeHelper를 비활성화하는 코드 스 니펫을 추가했습니다.

네트워킹 버그를 수정하십시오.

어떤 방법이 선호됩니까 .. 또는 기본적으로 동일한 작업을 수행합니까?

@TargetApi@SuppressLint동일한 코어 효과가 : 그들은 린트 오류를 억제.

차이점 @TargetApi은를 사용하면 매개 변수를 통해 코드에서 처리 한 API 수준을 선언하므로 나중에에서 인용 한 API 수준보다 새로운 것을 참조하도록 메서드를 수정하면 오류가 다시 나타날 수 있습니다 @TargetApi.

예를 들어, StrictMode네트워킹 버그에 대한 불만 을 차단하는 대신 AsyncTask최신 버전의 Android에서 직렬화되는 문제를 해결하려고 한다고 가정합니다 . 최신 장치에서 스레드 풀을 선택하고 이전 장치에서 기본 다중 스레드 동작을 사용하는 코드에 다음과 같은 메서드가 있습니다.

  @TargetApi(11)
  static public <T> void executeAsyncTask(AsyncTask<T, ?, ?> task,
                                          T... params) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
      task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
    }
    else {
      task.execute(params);
    }
  }

가지고 @TargetApi(11)있다는 것은 Lint가 내가 내 android:minSdkVersion. 이 경우 작동합니다. 그러나, 내가 API 레벨 14까지 추가되지 않은 참조 뭔가에이 방법을 변경 한 경우 내 때문에, 다음 린트 오류가 다시 나타납니다 @TargetApi(11)주석이 난 단지 레벨 11 API에 대한 작업에 코드를 고정 있다고하고 아래 위하지 API 레벨 14 이하 .

를 사용하면 내 코드 참조 및 처리하도록 설정된 코드에 관계없이 모든 API 수준에 @SuppressLint('NewApi')대한 Lint 오류가 손실됩니다 .

따라서 @TargetApi는 빌드 도구에 "OK, I fixed this category of issues"를보다 세밀한 방식으로 알릴 수 있으므로 선호되는 주석입니다.


나는 Async 접근 방식을 사용하는 것이 더 바람직하다는 것을 알고 있으며, 내 특별한 경우에는 해결 방법을 고수 할 것입니다. 이 자세하고 이해하기 쉬운 설명에 감사드립니다.이 기회에 Android 프로그래밍의 개념을 이해하는 데 많은 도움이 된 매우 유용한 웹 페이지에도 감사드립니다! R.
richey

9
@richey : "내 특별한 경우에는 해결 방법을 고수하겠습니다."-좋은 생각이 아닙니다. 모바일 장치는 모바일입니다. 네트워크 연결은 다소 불안정하며 다양한 상황 (예 : 약한 신호)에서 훨씬 더 많은 시간이 소요될 수 있습니다. 기본 애플리케이션 스레드에서 네트워크 I / O를 수행하면 앱이 현장에서 ANR과 함께 무작위로 충돌하게됩니다.
CommonsWare

2
와우, 귀하의 코드 예제는 내가 작성하려는 정확한 코드입니다! 우연의 일치 :)
Ilya Kogan 2013 년

4
if 문에서 Build.VERSION_CODES.HONEYCOMB를 사용하면 @TargetApi (Build.VERSION_CODES.HONEYCOMB)를 사용하는 것이 더 깔끔하고 일관성이 있습니까?
Oliver Pearmain

1
"API 레벨 14 이하가 아닌 API 레벨 11 이하에서만 작동하도록 코드를 수정했습니다." - "이상"을 의미하지 않습니까?
arekolek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.