何が良いですか:@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)リントが、私はより新しいものを使用していることを検出した場合、私のことを意味しandroid:minSdkVersionますが、APIレベル11まで、lintは文句ないでしょうが。この場合、それは機能します。ただし、APIレベル14まで追加されなかったものを参照するようにこのメソッドを変更した場合、Lintエラーが再び表示されます。これは、私の@TargetApi(11)注釈では、APIレベル11 以下で機能するようにコードを修正しただけで、上記のAPIレベル14 以下

使用して@SuppressLint('NewApi')、私はのためリントエラーを失うことになる任意の関係なく、どのような私のコードの参照と何私のコードは、ハンドルに設定されているのは、APIレベル。

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


非同期のアプローチを利用することが望ましいことを知っています。私の特定のケースでは、回避策に固執します。この詳細で非常に理解しやすい説明に感謝します。この機会に、Androidプログラミングの概念のいくつかを理解するのに非常に役立つ非常に役立つWebページにも感謝します。R.
リッチー2013年

9
@richey:「私の特定のケースでは、私は回避策に固執します」-それは良い考えではありません。モバイルデバイスはモバイルです。ネットワーク接続はかなり不安定で、さまざまな状況(信号が弱いなど)で著しく時間がかかる場合があります。メインアプリケーションスレッドでネットワークI / Oを実行すると、フィールドでANRが発生してアプリがランダムにクラッシュします。
CommonsWare 2013年

2
うわー、あなたのコード例は私が書こうとしている正確なコードです!なんという偶然:)
Ilya Kogan 2013年

4
ifステートメントでBuild.VERSION_CODES.HONEYCOMBを使用する場合、@ TargetApi(Build.VERSION_CODES.HONEYCOMB)を使用する方が一貫性がありませんか?
Oliver Pearmain 2014年

1
「APIレベル14以下ではなく、APIレベル11以下でのみ機能するようにコードを修正した」-「以上」という意味ですか?
arekolek 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.