1. 程式人生 > >SuppressLint黃色警告的原因以及解決辦法

SuppressLint黃色警告的原因以及解決辦法

最近在做專案的時候,碰到方法的前面和類的前面有時會出現@SuppressLint或者@SuppressWarnings這樣的黃色警告,看起來很不舒服,於是上網蒐集了一些相關資料。發現這些警告的出現其實是由於我們編寫程式碼時的一些不規範的寫法導致,解決這些問題其實是能提高我們程式的安全性、可用性和效能的。接下來就讓我為大家一一說明。  1、@SuppressLint(“DrawAllocation”)  原因:我們都知道View及其子類的OnDraw(Canvas canvas)方法會實時呼叫來更新介面的,然而有時我們會在onDraw(Canvas canvas)方法中例項化物件(如Paint paint=new Paint()),這樣就會影響我們程式的效率。  解決辦法:將這些物件改為類的成員變數。

2、@SuppressWarnings(“rawtypes”)和@SuppressWarnings({ “unchecked”, “rawtypes” })  不規範寫法:Class clazz = Class.forName(“android.view.Display”);  正確寫法:Class<?> clazz = Class.forName("android.view.Display");

3、@SuppressLint(“HandlerLeak”)  原因:Handler在Android中用於訊息的傳送與非同步處理,常常在Activity中作為一個匿名內部類來定義,此時Handler會隱式地持有一個外部類物件(通常是一個Activity)的引用。當Activity已經被使用者關閉時,由於Handler持有Activity的引用造成Activity無法被GC回收,這樣容易造成記憶體洩露。  解決辦法:將其定義成一個靜態內部類(此時不會持有外部類物件的引用),在構造方法中傳入Activity並對Activity物件增加一個弱引用,這樣Activity被使用者關閉之後,即便非同步訊息還未處理完畢,Activity也能夠被GC回收,從而避免了記憶體洩露。

public static class MyHandler extends Handler {
        private WeakReference<Activity> reference
        public MyHandler(Activity activity) {
            reference = new WeakReference<Activity>(activity);
        }
        @Override
        public void handleMessage(Message msg) {
            if (reference.get() != null) {
                switch (msg.what) {
                case 0:
                    // do something...
                    break;
                default:
                    // do something...
                    break;
                }
            }
        }
    }

另一種情況:

不規範的寫法:
 private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {

        };
    };
正確的寫法:
 private Handler mHandler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            return false;
        }
    });    

4、@SuppressLint(“SimpleDateFormat”)  不規範寫法:SimpleDateFormat format = new SimpleDateFormat(pattern);  正確寫法:SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.getDefault());

5、@SuppressLint(“DefaultLocale”)  不規範寫法:String lower = string.toLowerCase();  boolean b = “String”.toUpperCase().equals(“STRING”);  正確寫法:String lower = string.toLowerCase(Locale.getDefault());  boolean b = “String”.toUpperCase().equals(“STRING”);