2013-01-15 89 views
97

我在我的應用程序中有關於StrictMode的問題,並添加了基本禁用StrictModeHelper的代碼片段。然而,現在皮棉抱怨setThreadPolicy()並提出以添加有什麼更好的:@SuppressLint或@TargetApi?

@SuppressLint 'NewApi' 

@TargetApi(Build.VERSION_CODES.GINGERBREAD) 

onCreate()事件的看法。

哪種方法是首選..或者他們基本上是一樣的?

回答

174

我有問題,我就StrictMode的應用程序,並添加代碼片段,基本上禁止StrictModeHelper

請修正網絡錯誤。

哪種方法是首選的?或者他們基本上是一樣的嗎?

@TargetApi@SuppressLint具有相同的核心作用:它們抑制Lint錯誤。

區別在於,通過@TargetApi,您可以通過參數聲明代碼中已處理的API級別,以便稍後修改該方法以嘗試引用比API更新的東西時,該錯誤可以再次彈出級別在@TargetApi中引用。

例如,假設您沒有阻止關於您的網絡問題的StrictMode投訴,而是嘗試解決在較新版本的Android上序列化爲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); 
    } 
    } 

@TargetApi(11)意味着如果lint檢測,我使用的不是什麼新的我android:minSdkVersion,但直到API級別11,林特不會抱怨。在這種情況下,這是有效的。但是,如果我修改此方法以引用在API級別14之前未添加的內容,則將再次出現Lint錯誤,因爲我的@TargetApi(11)註釋表示我只修復了API級別11和 以下的代碼,並且在 以下以上,而不是以上的以下的API級別14和

使用@SuppressLint('NewApi'),無論我的代碼引用以及我的代碼是如何處理的,我都將失去Lint錯誤的任何 API級別。

因此,@TargetApi是首選註釋,因爲它允許您以更精細的方式告訴構建工具「好的,我解決了這類問題」。

+0

我知道,使用異步方法將是可取的,只是在我的特殊情況下,我會堅持解決方法。感謝這個詳細而且非常容易理解的解釋 - 在這個機會中,還要感謝你非常有用的網頁,這幫助我理解了Android編程的一些概念! R. – richey

+8

@richey:「就我個人而言,我會堅持解決方法」 - 這不是一個好主意。移動設備是移動設備。網絡連接相當不穩定,並且在各種情況下可能花費更多時間(例如,弱信號)。在主應用程序線程上執行網絡I/O意味着您的應用程序將在現場隨機與ANR崩潰。 – CommonsWare

+2

哇,你的代碼示例是我試圖編寫的EXACT代碼!真是巧合:) –

相關問題