100

I have issues in my app regarding StrictMode and added the code snippet that basically disables the StrictModeHelper. However, Lint complains about setThreadPolicy() now and proposes to either add

@SuppressLint 'NewApi'

or

@TargetApi(Build.VERSION_CODES.GINGERBREAD)

to the onCreate() event of the view.

Which method is prefered ..or are they basically doing the same?

4

1 に答える 1

177

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

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

どちらの方法が優先されますか..または基本的に同じことをしていますか?

@TargetApi同じコア効果があり@SuppressLintます。Lint エラーを抑制します。

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

たとえば、ネットワーク バグに関する苦情をブロックする代わりに、新しいバージョンの Android でシリアル化されるStrictMode問題を回避しようとしていたとします。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);
    }
  }

持つということは、Lint が API レベル 11 まで@TargetApi(11)の新しいものを使用していることを検出した場合android:minSdkVersion、Lint は文句を言わないということです。この場合、それは機能します。ただし、API レベル 14 まで追加されなかったものを参照するようにこのメソッドを変更した場合、Lint エラーが再び表示されます。これは、API レベル 11 以降で動作するように@TargetApi(11)コードを修正しただけで、API レベル 11以下でのみ動作するように修正したことが注釈に示されているためです。 API レベル 14以下

を使用すると、コードが参照するものやコードが処理するように設定されているものに関係なく、API レベル@SuppressLint('NewApi')Lint エラーが失われます。

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

于 2013-01-15T16:30:23.517 に答える