SpannableStringBuilder之坑

2019-07-29  本文已影响0人  CalvinNing
public SpannableStringBuilder append(CharSequence text) {
        int length = length();
        return replace(length, length, text, 0, text.length());
}

使用SpannableStringBuilderappend方法时,注意上述源码中的text.length(),一旦你append的字符串为null,就会NullPointerException。实际开发中,往往需要拼接的几个字段都是后台数据json解析而来,就我目前使用的框架fastjson而言,如果后台不返回该字段,则相应字段就是null,所以这个坑还是很容易踩到的

//StringBuilder方法
    @Override
    public StringBuilder append(CharSequence s) {
        super.append(s);
        return this;
    }
//AbstractStringBuilder方法
    @Override
    public AbstractStringBuilder append(CharSequence s) {
        if (s == null)
            return appendNull();
        if (s instanceof String)
            return this.append((String)s);
        if (s instanceof AbstractStringBuilder)
            return this.append((AbstractStringBuilder)s);

        return this.append(s, 0, s.length());
    }
//appendNull拼接的是null字符串
    private AbstractStringBuilder appendNull() {
        int c = count;
        ensureCapacityInternal(c + 4);
        final char[] value = this.value;
        value[c++] = 'n';
        value[c++] = 'u';
        value[c++] = 'l';
        value[c++] = 'l';
        count = c;
        return this;
    }

以上源码可以看出StringBuilderappend方法遇到null会追加一个"null"字符串,而不是出现异常
因此开发中,一般是用StringBuilder拼接字符串,拼接好之后再SpannableString ss = new SpannableString(sb.toString()),这样可以有效的避免NullPointerException引起程序崩溃。一般后台返回的字段都是一些必填项,而且我们通过此类处理,多是为了改变部分字体颜色、字号、点击事件等,因此使用此方法可以有效解决因异常数据导致的闪退。
如果不是以上的情况,建议通过三目运算符对数据进行判空TextUtils.isEmpty(str) ? "" : str

上一篇 下一篇

猜你喜欢

热点阅读