在onDraw()中调用ImageView.getDrawable()时发生NullPointerException

时间:2018-10-15 18:20:32

标签: android nullpointerexception imageview android-imageview android-9.0-pie

我有一个自定义ImageView,并且尝试在ImageView的getDrawable()方法中使用onDraw()。现在,这对于大多数设备和android版本似乎都可以正常工作,但是我现在开始在Google Pixel 2(Android 9)和其他一些运行Android 7.0的设备上收到 NullPointerException

有人知道为什么会这样吗?

public class CustomImageView extends android.support.v7.widget.AppCompatImageView {

    ...

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Drawable drawable = getDrawable();
        if (drawable == null)
            throw new NullPointerException("drawable must not be null");
    }

    ...

}

NPE 引发如下:

Fatal Exception: java.lang.NullPointerException: drawable must not be null
   at de.simonmayrshofer.dfvafftrainer.imagemagnifier.ImageMagnifier.onDraw(ImageMagnifier.java:109)
   at android.view.View.draw(View.java:20207)
   at android.view.View.updateDisplayListIfDirty(View.java:19082)
   at android.view.View.draw(View.java:19935)
   at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
   at android.view.View.draw(View.java:20210)
   at android.view.View.updateDisplayListIfDirty(View.java:19082)
   at android.view.View.draw(View.java:19935)
   at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
   at android.view.View.updateDisplayListIfDirty(View.java:19073)
   at android.view.View.draw(View.java:19935)
   at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
   at android.view.View.draw(View.java:20210)
   at android.widget.ScrollView.draw(ScrollView.java:1739)
   at android.view.View.updateDisplayListIfDirty(View.java:19082)
   at android.view.View.draw(View.java:19935)
   at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
   at android.view.View.updateDisplayListIfDirty(View.java:19073)
   at android.view.View.draw(View.java:19935)
   at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
   at android.view.View.updateDisplayListIfDirty(View.java:19073)
   at android.view.View.draw(View.java:19935)
   at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
   at android.view.View.updateDisplayListIfDirty(View.java:19073)
   at android.view.View.draw(View.java:19935)
   at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
   at android.view.View.updateDisplayListIfDirty(View.java:19073)
   at android.view.View.draw(View.java:19935)
   at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
   at android.view.View.updateDisplayListIfDirty(View.java:19073)
   at android.view.View.draw(View.java:19935)
   at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
   at android.view.View.updateDisplayListIfDirty(View.java:19073)
   at android.view.View.draw(View.java:19935)
   at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
   at android.view.View.updateDisplayListIfDirty(View.java:19073)
   at android.view.View.draw(View.java:19935)
   at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
   at android.view.View.draw(View.java:20210)
   at com.android.internal.policy.DecorView.draw(DecorView.java:780)
   at android.view.View.updateDisplayListIfDirty(View.java:19082)
   at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:686)
   at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:692)
   at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:801)
   at android.view.ViewRootImpl.draw(ViewRootImpl.java:3312)
   at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:3116)
   at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2485)
   at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1460)
   at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7184)
   at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
   at android.view.Choreographer.doCallbacks(Choreographer.java:761)
   at android.view.Choreographer.doFrame(Choreographer.java:696)
   at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
   at android.os.Handler.handleCallback(Handler.java:873)
   at android.os.Handler.dispatchMessage(Handler.java:99)
   at android.os.Looper.loop(Looper.java:193)
   at android.app.ActivityThread.main(ActivityThread.java:6669)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ScrollView
        android:id="@+id/xxx"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:animateLayoutChanges="true"
            android:gravity="bottom"
            android:orientation="vertical">

             <de.xxx.CustomImageView
                    android:id="@+id/xxx"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_margin="@dimen/fragment_margin"
                    android:adjustViewBounds="true"
                    android:scaleType="fitCenter"
                    android:src="someimage.png"
                    android:visibility="gone" />

        </LinearLayout>

    </ScrollView>

</RelativeLayout>

我正在使用Picasso将onCreateView()中的资产中的图像加载到ImageView中:

Picasso.with(getActivity()).load("file:///android_asset/img/abc.jpg".into(imageView);

0 个答案:

没有答案