Apa yang lebih baik: @SuppressLint atau @TargetApi?

100

Saya memiliki masalah di aplikasi saya terkait StrictModedan menambahkan cuplikan kode yang pada dasarnya menonaktifkan StrictModeHelper. Namun, Lint mengeluh tentang setThreadPolicy()sekarang dan mengusulkan untuk menambahkan

@SuppressLint 'NewApi'

atau

@TargetApi(Build.VERSION_CODES.GINGERBREAD)

ke onCreate()acara view.

Metode mana yang lebih disukai ..atau apakah mereka pada dasarnya melakukan hal yang sama?

richey
sumber

Jawaban:

176

Saya memiliki masalah di aplikasi saya terkait StrictMode dan menambahkan cuplikan kode yang pada dasarnya menonaktifkan StrictModeHelper

Harap perbaiki bug jaringan.

Metode mana yang lebih disukai ..atau apakah mereka pada dasarnya melakukan hal yang sama?

@TargetApidan @SuppressLintmemiliki efek inti yang sama: mereka menekan error Lint.

Perbedaannya adalah dengan @TargetApi, Anda mendeklarasikan, melalui parameter, level API apa yang telah Anda atasi dalam kode Anda, sehingga kesalahan dapat muncul lagi jika Anda kemudian mengubah metode untuk mencoba mereferensikan sesuatu yang lebih baru daripada level API yang disebutkan di @TargetApi.

Sebagai contoh, anggap saja, alih-alih memblokir StrictModekeluhan tentang bug jaringan Anda, Anda mencoba untuk mengatasi masalah AsyncTaskserialisasi pada versi Android yang lebih baru. Anda memiliki metode seperti ini di kode Anda untuk ikut serta ke kumpulan utas pada perangkat yang lebih baru dan menggunakan perilaku multithread default pada perangkat yang lebih lama:

  @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);
    }
  }

Memiliki @TargetApi(11)artinya jika Lint mendeteksi bahwa saya menggunakan sesuatu yang lebih baru dari milik saya android:minSdkVersion, namun hingga API Level 11, Lint tidak akan mengeluh. Dalam hal ini, itu berhasil. Namun, jika saya memodifikasi metode ini untuk mereferensikan sesuatu yang tidak ditambahkan hingga API Level 14, maka kesalahan Lint akan muncul lagi, karena @TargetApi(11)anotasi saya mengatakan bahwa saya hanya memperbaiki kode agar berfungsi pada API Level 11 dan di bawahnya , bukan API Level 14 ke bawah .

Dengan menggunakan @SuppressLint('NewApi'), saya akan kehilangan kesalahan Lint untuk level API apa pun , terlepas dari apa referensi kode saya dan apa yang kode saya siapkan untuk ditangani.

Karenanya, @TargetApiadalah anotasi yang disukai, karena memungkinkan Anda memberi tahu alat pembuat "OK, saya memperbaiki kategori masalah ini" dengan cara yang lebih terperinci.

CommonsWare
sumber
Saya sadar bahwa menggunakan pendekatan Async akan lebih disukai, hanya dalam kasus khusus saya, saya akan tetap menggunakan solusi. Terima kasih atas penjelasan yang mendetail dan sangat mudah dimengerti ini - dan pada kesempatan ini, terima kasih juga atas halaman web Anda yang sangat membantu yang banyak membantu saya untuk memahami beberapa konsep pemrograman Android! R.
richey
9
@richey: "hanya dalam kasus saya, saya akan tetap menggunakan solusi" - itu bukan ide yang baik. Perangkat seluler adalah seluler. Koneksi jaringan agak tidak stabil dan mungkin memerlukan lebih banyak waktu dalam berbagai keadaan (misalnya, sinyal lemah). Melakukan I / O jaringan pada thread aplikasi utama berarti bahwa aplikasi Anda akan mogok secara acak dengan ANR di lapangan.
CommonsWare
2
Wow, contoh kode Anda adalah kode TEPAT yang saya coba tulis! Benar-benar kebetulan :)
Ilya Kogan
4
Bukankah lebih rapi / lebih konsisten untuk menggunakan @TargetApi (Build.VERSION_CODES.HONEYCOMB) asalkan Anda menggunakan Build.VERSION_CODES.HONEYCOMB di pernyataan if?
Oliver Pearmain
1
"bahwa saya hanya memperbaiki kode agar berfungsi pada API Level 11 dan di bawahnya, bukan API Level 14 dan di bawahnya." - bukankah maksudmu "dan di atas"?
arekolek