Слишком много времени на метод onmeasure после setImageBitmap ImageView - PullRequest
3 голосов
/ 11 октября 2011

долгое время читатель, впервые спрашивающий, поэтому, пожалуйста, будьте осторожны;)

У меня есть код Android, который отображает около 10 изображений в секунду в ImageView. (вызывая setImageBitmap в ImageView для установки нового растрового изображения) Это приводит к задержкам отображения, поэтому я стараюсь максимально ускорить его.

Я обнаружил, что (с помощью traceview) это приложение тратит много времени на методы:

ViewRoot.performTraversals
View.measure
FrameLayout.onmeasure
ViewGrou.measureChildWithMargins

Я подозреваю, что при измерении ImageView у меня есть создание CustomImageView и overide onMeasure, просто чтобы вызвать метод super и написать sysout.

Кажется, что после каждого setImageBitmap onmeasure вызывается 3 раза. Растровые изображения всегда одинакового размера, поэтому изменений нет. На самом деле это может изменяться время от времени, когда источник изображения изменяется, но это должно быть измерено только тогда.

Что я могу изменить, переопределить, сделать, чтобы исключить влияние этого измерения на скорость приложения?

Если вам нужна дополнительная информация, сообщите мне, и я предоставлю ее.

Пример кода

final Bitmap bitmapScaled = Bitmap.createScaledBitmap(bitmap2, width, height, false);
imageView2.setScaleType(ScaleType.CENTER_INSIDE);
if (setSize) {
    setSize(imageView2, width, height);
}
imageView2.setImageBitmap(bitmapScaled);

Метод, который я изменяю, чтобы заставить его работать быстрее (возможно, небезопасно?!)

boolean layout=true;

int noL=1;

@Override
public void requestLayout() {
    if (layout){
        super.requestLayout();              
        if (noL>10){
            layout=false;
        }else{
            noL++;
        }
    }
}

1 Ответ

6 голосов
/ 08 марта 2012

Когда у меня была похожая проблема, я делал следующее:

public class ImageViewEx extends ImageView{
    private boolean makeRequest;
    public ImageViewEx(Context context){
        super(context);makeRequest=true;
    }
    public ImageViewEx(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public ImageViewEx(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
         makeRequest=true;
    }
    public void setImageBitmapNoRequestLayout(Bitmap bitmap) {
        makeRequest = false;
        setImageBitmap(bitmap);
        makeRequest = true;
    }
    @Override public void requestLayout(){
        if(makeRequest)super.requestLayout();
    }
}

Теперь изменение растрового изображения с помощью setImageBitmapNoRequestLayout(...) не вызывает requestLayout().

...