使用毕加索在 AppCompatActivity 中的空引用上获取 ApplicationContext

getApplicationContext on a null reference in AppCompatActivity using Picasso

我正在将 url 中的图片加载到位图中。下面的代码适用于扩展 Fragment 的先前 classes。这次,我只是复制代码并尝试在扩展 AppCompatActivity 的 class 中使用它。唯一的区别是我获取上下文的方式。

public void loadBitmap(String url) {
    if (loadtarget == null) loadtarget = new Target() {
        @Override
        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
            handleLoadedBitmap(bitmap);
        }

        @Override
        public void onBitmapFailed(Drawable errorDrawable) {
        }

        @Override
        public void onPrepareLoad(Drawable placeHolderDrawable) {
        }
    };
    mContext = MyActivity.this;
    Picasso.with(mContext).load(url).into(loadtarget); //giving me null
}

在原始代码中,我在 Fragment 中使用它的地方是

Picasso.with(getActivity()).load(url).into(loadtarget);

所以现在,由于这个 class 扩展了 AppCompatActivity,我想我可以使用 "this" 或 MyActivity.this,但那没有用。我已经尝试在 onCreate 中初始化一个上下文变量 "mContext" ,然后就在我将图像加载到位图中之前(如上),但都没有用。我试过 this.getApplicationContext() 并且我也试过将 mContext 作为参数传递给 loadBitmap() 方法,但这也没有用。

我的 URL 字符串是正确的。我只是不确定在尝试之后如何解决这个问题,似乎是一切。

最后一条信息,异常:

 java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
                                                                 at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:112)
                                                                 at com.salty.seas.Driver.MyActivity.loadBitmap(MyActivity.java:144)
                                                                 at com.salty.seas.Driver.MyActivity.onKeyEntered(MyActivity.java:61)
                                                                 at com.firebase.geofire.GeoQuery.run(GeoQuery.java:126)
                                                                 at android.os.Handler.handleCallback(Handler.java:739)
                                                                 at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                 at android.os.Looper.loop(Looper.java:158)
                                                                 at android.app.ActivityThread.main(ActivityThread.java:7224)
                                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

在你说 activity,loadBitmap() 所属的问题的评论中,你实际上实例化了自己(在其他片段中)并将其用作实用程序 class.

您应该永远不要手动创建活动,因为它们由android管理,并且它们有一个生命周期android 维护。

在您的情况下,activity 状态不正确(其中一个内部字段为空),这就是您获得 NPE 的原因。

对于实用程序方法,创建实用程序 classes 并从任何你想要的地方调用它们。