web-dev-qa-db-ja.com

何が優れている:@SuppressLintまたは@TargetApi?

アプリにStrictModeに関する問題があり、StrictModeHelperを基本的に無効にするコードスニペットを追加しました。しかし、LintはsetThreadPolicy()について今文句を言い、追加することを提案します

@SuppressLint 'NewApi'

または

@TargetApi(Build.VERSION_CODES.Gingerbread)

ビューのonCreate()イベントに。

どちらの方法が推奨されますか。または基本的に同じ方法ですか?

100
richey

StrictModeに関するアプリに問題があり、基本的にStrictModeHelperを無効にするコードスニペットを追加しました

ネットワークのバグを修正してください。

どちらの方法が推奨されますか。または基本的に同じ方法ですか?

@TargetApi@SuppressLintのコア効果は同じです。これらはLintエラーを抑制します。

違いは、@TargetApiを使用すると、コードで指定したAPIレベルをパラメーターを介して宣言するため、後でメソッドを変更してAPIより新しいものを参照しようとするとエラーが再び表示される@TargetApiで引用されているレベル。

たとえば、ネットワークバグに関するStrictModeの苦情をブロックする代わりに、Androidの新しいバージョンでAsyncTaskがシリアル化されるという問題を回避しようとしているとします。新しいデバイスではスレッドプールにオプトインし、古いデバイスではデフォルトのマルチスレッド動作を使用するコードに次のようなメソッドがあります。

  @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)を持っているということは、Android:minSdkVersionよりも新しいものを使用していることをLintが検出した場合でも、APIレベル11までは、Lintは文句を言いません。この場合、それは機能します。ただし、APIレベル14まで追加されなかったものを参照するようにこのメソッドを変更した場合、@TargetApi(11)アノテーションはAPIレベル11で動作するようにコードを修正したことを示すため、Lintエラーが再び表示されますそして 未満 上記、APIレベル14ではなく 未満 上記。

@SuppressLint('NewApi')を使用すると、any APIレベルのLintエラーが失われます。これは、コードが参照するものや処理するコードの設定に関係ありません。

したがって、@TargetApiが推奨される注釈です。これにより、ビルドツールに「OK、このカテゴリの問題を修正しました」と、よりきめ細かく伝えることができます。

176
CommonsWare