天天看點

Android項目開發中高頻問題1 | 代碼稽核

1.對象的建立或接口的請求在需要的時候才執行

這樣的現象遇到過三次,分别是

  1. 我們應用中有用到智齒客服,客服需要調用接口初始化使用者資訊内容。有一版本我們要優化首頁的接口,發現這個

    初始化使用者資訊

    的接口是放在首頁的。

    參考做法:客服使用者使用客服的頻次很低,而且使用App期間可能會更換賬号,是以應該在點選客服入口那裡調用初始化使用者資訊的接口。

  2. 我們應用中有直播SDK,直播SDK需要配置進使用者資訊,發現處理的是每次進入app或者更換賬号的時候配置,這個配置首次會導緻卡頓。

    參考做法:因為使用者還沒有進入直播,且直播也不是我們的主要業務,還沒用到這個資訊,正确的做法是每次進直播判斷是否有配置使用者資訊或者更換了使用者,然後再進行配置操作。

  3. adapter裡點選會有一個彈框,彈框裡的文案會用到一個配置接口裡的資料,錯誤的做法是進去頁面就調用接口得到這個資料。

    參考做法:點選的時候拿這個資料且存為變量,下次有的話直接取。

這幾個基本都不影響業務邏輯,是優化項,但是對App資源消耗有影響,算是邏輯規範問題。

2.shape的gradient屬性

android:type="radial"

問題

如果android:type="radial",沒有設定android:gradientRadius,将會報錯

https://blog.csdn.net/zjdyhant/article/details/46537647

就是說使用漸變色時,

android:type="radial"

android:gradientRadius

需要成對出現,否則可能會産成崩潰,在友盟背景看見崩潰率還挺高的。

3.integer.parseInt(id)

如果id為空會抛錯誤

new NumberFormatException("s == null")

,注意空處理

4.可以在fragment裡直接擷取宿主activity裡的資料

可以友善的在fragment裡得到宿主activity,然後再得到裡面的資料,而不用通過 RxBus 或 intent傳給fragment,特别是資料量大的時候應該避免後面的傳值操作。

5.合理利用變量,避免多次使用緩存

例如我們使用一個緩存資料得到存的曆史搜尋資料:

DataUtil.getHistoryData();           

複制

應該避免這樣的處理:

if(DataUtil.getHistoryData() != null ){
    // 處理邏輯
    HistoryBean bean = DataUtil.getHistoryData();
}           

複制

而是這樣處理,少一次取緩存的次數:

HistoryBean bean = DataUtil.getHistoryData();
if(bean != null ){
    // 處理邏輯
    bean.get();
    ...
}           

複制

6.避免濫用SharedPreferences

業務場景:

在進一個頁面A如果勾選狀态,進入頁面B的時候會帶上這個狀态。有時候我們不能通過intent傳遞,例如一些三方SDK的時候,需要記錄這個值。

不當做法:

點選勾選後通過SP記錄勾選狀态,然後進入其他頁面再取,在打開App的時候重置這個值。

參考做法:

存一個全局記憶體變量,點選勾選後更改變量值,然後在另一個頁面使用,退出App時重置這個值。

7.使用

android:launchMode="singleTask"

然後打開Activity問題

我們有一個需求,點選按鈕要定位在首頁的第二個tab下,如果配置了

singleTask

打開其Activity時會清空上層的Activity,然後再setCurrentItem(),這樣就達到了效果。

然後發現,這樣會導緻Activity裡面的

fragment

走兩次

onPause()

方法,影響了資料統計。然後不打開直接定位

setCurrentItem()

就沒問題,因為我們是在此Activity下兩個不同的fragment定位的,是以可以這樣做,如果在下級頁面估計也會有這樣的問題。

8.别在intent裡傳大量的資料

這個是個基本常識了,傳大量的資料,輕則卡頓的很厲害,重則直接崩潰。

9.記得處理else的情況,特别是在adapter裡

adapter處理各種邏輯時,注意else的處理

處理接口請求時,注意error和資料為空的處理

10.float值不能直接對比

工具類:

/**
     * 得到兩個float比較的結果
     *
     * @return 傳回值
     * a = -1,表示 source 小于 duibi
     * a = 0,表示 source 等于 duibi;
     * a = 1,表示 source 大于 duibi;
     */
    public static int getCompareResult(float source, float duibi) {
        try {
            BigDecimal bigDecimal = new BigDecimal(Float.toString(source));
            BigDecimal duibi3 = new BigDecimal(Float.toString(duibi));
            return bigDecimal.compareTo(duibi3);
        } catch (Exception e) {
            DebugUtil.error(e.getMessage());
            int i = (int) (source * 10) - (int) (duibi * 10);
            return Integer.compare(i, 0);
        }
    }           

複制

11.在adapter裡設定值然後在其他地方取不可取

adapter更新不是同步的,設定值後直接在另一個地方使用可能會有問題,不是實時資料,最好還是通過資料得到。