Странный (недействительный?) Стек трассировки в Android? - PullRequest
1 голос
/ 29 ноября 2011

Вероятно, это больше из любопытства, а не из-за желания решить проблему, потому что это казалось случайным и только один раз.Однако, возможно, это может пролить некоторый свет на некоторые неясные аспекты Java или Android.

Мы используем библиотеку Lightstreamer , и по сути это потоковая библиотека, для которой мы регистрируем простого слушателя.который вызывается всякий раз, когда потоковая передача предоставляет новые значения.

Я обнаружил исключение в своем приложении и проверил трассировку стека в logcat.Я не могу понять, что там происходит.Вот (соответствующая) вершина трассировки:

11-25 15:06:50.770 E/AndroidRuntime( 3100): FATAL EXCEPTION: main
11-25 15:06:50.770 E/AndroidRuntime( 3100): java.lang.NullPointerException
11-25 15:06:50.770 E/AndroidRuntime( 3100):     at com.lightstreamer.ls_client.UpdateInfoImpl.getNewValue(UpdateInfoImpl.java:142)
11-25 15:06:50.770 E/AndroidRuntime( 3100):     at com.ourapp.view.ShrinkingTextViewHelper.onMeasure(ShrinkingTextViewHelper.java:30)
11-25 15:06:50.770 E/AndroidRuntime( 3100):     at com.ourapp.view.ButtonEx.onMeasure(ButtonEx.java:67)
11-25 15:06:50.770 E/AndroidRuntime( 3100):     at android.view.View.measure(View.java:10828)

А вот ShrinkingTextViewHelper.java в целом:

package com.ourapp.view;

import android.text.TextPaint;
import android.text.TextUtils.TruncateAt;

/**
 * Check text size on view and change the text size if it's width not fit to control's width  
 *
 */
public class ShrinkingTextViewHelper {
    public static void onMeasure(ShrinkingTextView view, int widthMeasureSpec, int heightMeasureSpec) {
        CharSequence text = view.getText();
        view.onMeasureSuper(widthMeasureSpec, heightMeasureSpec);

        TextPaint paint = view.getPaint();

        float paddings = view.getPaddingLeft() + view.getPaddingRight();

        paint.setTextSize(view.getInitialTextSize());

        float size = paint.getTextSize();
        while (size >= view.getMinTextSize()
                && paddings + paint.measureText(text, 0, text.length()) > view.getMeasuredTextWidth()
                && (view.getLineCount() == 1 || view.getLineCount() > view.getMaxLines())) {
            paint.setTextSize(--size);
            view.setText(text);
            view.onMeasureSuper(widthMeasureSpec, heightMeasureSpec);
        }

line 30:if (paddings + paint.measureText(text, 0, text.length()) > view.getMeasuredTextWidth()) {
            view.setEllipsize(TruncateAt.END);
        }
    }
}

Это класс ButtonEx, который также присутствуетв стековой трассировке:

package com.ourapp.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.text.method.SingleLineTransformationMethod;
import android.util.AttributeSet;
import android.widget.Button;

import com.ourapp.R;
/**
 * Extended button class. It could shrink text on the face.
 *
 */
public class ButtonEx extends Button implements ShrinkingTextView {
    private static final float DEFAULT_MIN_TEXT_SIZE_DP = 10;

    private float minTextSizePx;
    private float initialTextSize;
    private int maxLines;

    /**
     * Class constructor
     * @param context
     * @param attrs
     */
    public ButtonEx(Context context, AttributeSet attrs) {
        super(context, attrs);

        TypedArray t = getContext().obtainStyledAttributes(attrs, R.styleable.ButtonEx);
        minTextSizePx = t.getDimension(R.styleable.ButtonEx_minTextSize, dipToPixels(DEFAULT_MIN_TEXT_SIZE_DP));

        t.recycle();

        int att[] = new int[] { android.R.attr.singleLine };
        t = getContext().obtainStyledAttributes(attrs, att);
        boolean singleLine = t.getBoolean(0, true);
        boolean hasSingleLine = t.hasValue(0);
        t.recycle();

        att = new int[] { android.R.attr.maxLines };
        t = getContext().obtainStyledAttributes(attrs, att);

        boolean hasMaxLines = t.hasValue(0);

        if (singleLine && hasSingleLine) {
            maxLines = 1;
        } else {
            maxLines = t.getInteger(0, 1);
        }

        if (singleLine && hasSingleLine
                || !hasSingleLine && !hasMaxLines) {
            setTransformationMethod(new SingleLineTransformationMethod());
        }

        setMaxLines(maxLines);
        t.recycle();

        att = new int[] { android.R.attr.textSize };
        t = getContext().obtainStyledAttributes(attrs, att);
        initialTextSize = t.getDimension(0, 0);
        t.recycle();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        ShrinkingTextViewHelper.onMeasure(this, widthMeasureSpec, heightMeasureSpec);
    }

    private float dipToPixels(float dip) {
        return dip * getContext().getResources().getDisplayMetrics().density;
    }

    /**
     * Get min size of text on title.
     */
    public float getMinTextSize() {
        return minTextSizePx;
    }

    /**
     * Called to determine the size requirements for this view and all of its children. 
     */
    public void onMeasureSuper(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    /**
     * Get text width
     */
    public int getMeasuredTextWidth() {
        return getMeasuredWidth();
    }

    /**
     * Get max lines number. It parsed from XML attributes. Default value is 1.
     */
    public int getMaxLines() {
        return maxLines;
    }

    @Override
    protected void onTextChanged(CharSequence text, int start, int before,
            int after) {
        super.onTextChanged(text, start, before, after);
        requestLayout();
    }

    /**
     * Get initial text size.
     */
    public float getInitialTextSize() {
        return initialTextSize;
    }
}

Как вы можете догадаться, нет ни единой ссылки на библиотеку lightstreamer в помощнике, которая просто отвечает за некоторое измерение пользовательских представлений.Это заставляет меня думать, что это ошибка в виртуальной машине Dalvik или что-то в этом роде.

Кстати, приложение было построено как обычно в Eclipse.

И да, текст на кнопке не взят из значений, предоставленных lighttreamer, я могу гарантировать, что

1 Ответ

0 голосов
/ 29 ноября 2011

Посмотрите на правильный файл / класс: -)

Исключение происходит из класса ShrinkingTextViewHelper в com.ourapp.view, в то время как опубликованный класс живет в com.ourapp.

Счастливое кодирование.

...