1. ホーム
  2. android

[解決済み] どっちがいい?SuppressLintと@TargetApiのどちらが良いですか?

2023-01-03 19:58:21

質問

私のアプリでは、次のような問題があります。 StrictMode を基本的に無効にするコードスニペットを追加しました。 StrictModeHelper . しかし、Lintは setThreadPolicy() を追加するよう提案します。

@SuppressLint 'NewApi'

または

@TargetApi(Build.VERSION_CODES.GINGERBREAD)

onCreate() イベントに追加します。

どの方法が好ましいですか ...それとも、基本的に同じことをするのでしょうか?

どのように解決するのですか?

<ブロッククオート

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

ネットワークに関するバグを修正してください。

<ブロッククオート

どの方法が好ましいのでしょうか。それとも、基本的に同じ方法なのでしょうか。

@TargetApi そして @SuppressLint は同じ核心的な効果を持っています: これらはLintエラーを抑制します。

違いは @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 Level 11までのものを使っていることを検知しても、Lintは文句を言いません。この場合、それはうまくいきます。しかし、このメソッドを修正してAPI Level 14まで追加されていないものを参照するようにした場合、Lintのエラーは再び表示されます。 @TargetApi(11) アノテーションによると、API Level 11 で動作するようにコードを修正しただけであり、API Level 14 で動作するようにコードを修正したのは 以下 上で動作するように修正しただけで、API Level 14 と の下にある よりも上です。

使用方法 @SuppressLint('NewApi') の Lint エラーをなくすことができます。 任意の API レベルで、私のコードが何を参照しているか、私のコードが何を処理するように設定されているかに関係なく、Lint エラーを失います。

したがって @TargetApi は、ビルドツールに「OK、この問題のカテゴリを修正しました」と、よりきめ細かく伝えることができるため、好ましいアノテーションと言えます。