Hangisi daha iyi: @SuppressLint veya @TargetApi?


100

Uygulamamda StrictModetemelde StrictModeHelper. Ancak, Lint setThreadPolicy()şimdiden şikayet ediyor ve her ikisini de eklemeyi öneriyor

@SuppressLint 'NewApi'

veya

@TargetApi(Build.VERSION_CODES.GINGERBREAD)

için onCreate()görünümün olay.

Hangi yöntem tercih edilir .. yoksa temelde aynı şeyi mi yapıyorlar?

Yanıtlar:


176

Uygulamamda StrictMode ile ilgili sorunlar yaşıyorum ve StrictModeHelper'ı temelde devre dışı bırakan kod pasajını ekledim

Lütfen ağ iletişimi hatasını düzeltin.

Hangi yöntem tercih edilir .. yoksa temelde aynı şeyi mi yapıyorlar?

@TargetApive @SuppressLintaynı temel etkiye sahiptirler: Lint hatasını bastırırlar.

Aradaki fark, @TargetApiparametre aracılığıyla, kodunuzda hangi API düzeyini ele aldığınızı belirtmenizdir, böylece daha sonra, belirtilen API düzeyinden daha yeni bir şeye başvurmayı denemek için yöntemi değiştirirseniz, hata tekrar ortaya çıkabilir @TargetApi.

Örneğin, StrictModeağ iletişimi hatanızla ilgili şikayetleri engellemek yerine AsyncTask, Android'in daha yeni sürümlerinde serileştirme sorununu çözmeye çalıştığınızı varsayalım . Daha yeni cihazlarda iş parçacığı havuzunu seçmek ve eski aygıtlarda varsayılan çok iş parçacıklı davranışı kullanmak için kodunuzda buna benzer bir yönteminiz var:

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

Sahip olmak @TargetApi(11) demektir ki, Lint benimkinden daha yeni bir şey kullandığımı algılarsa android:minSdkVersion, ancak API Seviye 11'e kadar Lint şikayet etmeyecektir. Bu durumda işe yarıyor. Bununla birlikte, bu yöntemi API Düzeyi 14'e kadar eklenmemiş bir şeyi referans alacak şekilde değiştirirsem, Lint hatası tekrar görünür, çünkü @TargetApi(11)ek açıklamam, kodu yalnızca API Düzeyi 11 ve altında çalışacak şekilde düzelttiğimi söylüyor , değil API Seviye 14 ve aşağıda yukarıda.

Kullanarak @SuppressLint('NewApi'), kod referanslarımın ve kodumun işlemek için ne ayarlandığına bakılmaksızın, herhangi bir API seviyesi için Lint hatasını kaybedebilirim .

Bu nedenle, @TargetApiderleme araçlarına daha ayrıntılı bir şekilde "Tamam, bu sorun kategorisini düzelttim" demenize izin verdiği için tercih edilen ek açıklamadır.


Zaman uyumsuz bir yaklaşım kullanmanın tercih edilebilir olduğunun farkındayım, sadece benim özel durumumda geçici çözüme bağlı kalacağım. Bu ayrıntılı ve çok anlaşılır açıklama için teşekkürler - ve bu fırsatta, Android programlamanın bazı kavramlarını anlamama çok yardımcı olan çok yardımcı web sayfalarınız için de teşekkürler! R.
richey

9
@richey: "sadece benim özel durumumda geçici çözüme bağlı kalacağım" - bu iyi bir fikir değil. Mobil cihazlar mobildir. Ağ bağlantıları oldukça istikrarsızdır ve çeşitli durumlarda (örneğin zayıf sinyal) önemli ölçüde daha fazla zaman alabilir. Ana uygulama iş parçacığında ağ G / Ç gerçekleştirmek, uygulamanızın sahada bir ANR ile rastgele kilitleneceği anlamına gelir.
CommonsWare

2
Vay canına, kod örneğiniz yazmaya çalıştığım TAM kod! Ne tesadüf :)
Ilya Kogan

4
If deyiminde Build.VERSION_CODES.HONEYCOMB'u kullandığınızda @TargetApi (Build.VERSION_CODES.HONEYCOMB) kullanmanız daha düzgün / daha tutarlı olmaz mıydı?
Oliver Pearmain

1
"kodu API Düzeyi 14 ve altında değil, yalnızca API Düzeyi 11 ve altında çalışacak şekilde düzelttim." - "ve üstü" demek istemedin mi?
arekolek
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.