使用毕加索在 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 并从任何你想要的地方调用它们。
我正在将 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 并从任何你想要的地方调用它们。