为什么我的家庭作业会出现 "Context = NullPointerException" 错误?
Why do I get this "Context = NullPointerException" error in my homework?
我正在做作业教程,即构建 Instagram 应用程序。该教程大约已有两年历史,我在编码方面遇到了一些问题。
我遇到以下错误,但不确定原因。
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
我的 UniversalImageLoader class
public class UniversalImageLoader {
private static final int defaultImage = R.drawable.ic_android;
private Context mContext;
public UniversalImageLoader(Context context) {
mContext = context;
}
public ImageLoaderConfiguration getConfig(){
//File cacheDir = StorageUtils.getCacheDirectory(mContext);
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(mContext)//<--the error is in this line
.memoryCacheExtraOptions(480, 800) // default = device screen dimensions
.diskCacheExtraOptions(480, 800, null)
.threadPriority(Thread.NORM_PRIORITY - 2) // default
.tasksProcessingOrder(QueueProcessingType.FIFO) // default
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new LruMemoryCache(2 * 1024 * 1024))
.memoryCacheSize(2 * 1024 * 1024)
.memoryCacheSizePercentage(13) // default
.diskCacheSize(50 * 1024 * 1024)
.diskCacheFileCount(100)
.diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
.imageDownloader(new BaseImageDownloader(mContext)) // default
.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
.writeDebugLogs()
.build();
return config;
}
在 HomeActivity:(和 OnCreate)[在每个 Activity 中我都这样称呼它]
initImageLoader();
private void initImageLoader(){
UniversalImageLoader universalImageLoader = new UniversalImageLoader(mContext);
ImageLoader.getInstance().init(universalImageLoader.getConfig());
}
当您创建 UniversalImageLoader class 的对象时,传递 getApplicationContext() 而不是 activity context .
应用程序上下文在整个应用程序中可用,而 activity 上下文绑定到 activity 生命周期。
更新:
Application Context:它是一个单例实例,可以通过 getApplicationContext() 在 activity 中访问。此上下文与应用程序的生命周期相关联。应用程序上下文可用于您需要其生命周期与当前上下文分离的上下文,或者当您传递超出 activity
范围的上下文时
private void initImageLoader(){
UniversalImageLoader universalImageLoader = new UniversalImageLoader(getApplicationContext());
ImageLoader.getInstance().init(universalImageLoader.getConfig());
}
Activity 上下文 此上下文在 activity 中可用。此上下文与 activity 的生命周期相关联。
在此处详细了解 Activity 上下文和应用程序上下文的区别。
https://blog.mindorks.com/understanding-context-in-android-application-330913e32514
对于多个 Activity,您可以在 Application class onCreate 方法中进行初始化。
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// Initialize the Universal Image Loader here
DisplayImageOptions defaultOptions = new
DisplayImageOptions.Builder()
.cacheOnDisk(true).cacheInMemory(true).build();
ImageLoaderConfiguration config = new
ImageLoaderConfiguration.Builder(getApplicationContext())
.defaultDisplayImageOptions(defaultOptions).build();
ImageLoader.getInstance().init(config);
}
然后在你的 Activity 中获取像这样的图像加载器实例。
ImageLoader mImageLoader = ImageLoader.getInstance();
您还需要像这样在 AndroidManifest 中添加您的应用程序 class。
<application
android:name=".MyApplication"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
我正在做作业教程,即构建 Instagram 应用程序。该教程大约已有两年历史,我在编码方面遇到了一些问题。
我遇到以下错误,但不确定原因。
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
我的 UniversalImageLoader class
public class UniversalImageLoader {
private static final int defaultImage = R.drawable.ic_android;
private Context mContext;
public UniversalImageLoader(Context context) {
mContext = context;
}
public ImageLoaderConfiguration getConfig(){
//File cacheDir = StorageUtils.getCacheDirectory(mContext);
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(mContext)//<--the error is in this line
.memoryCacheExtraOptions(480, 800) // default = device screen dimensions
.diskCacheExtraOptions(480, 800, null)
.threadPriority(Thread.NORM_PRIORITY - 2) // default
.tasksProcessingOrder(QueueProcessingType.FIFO) // default
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new LruMemoryCache(2 * 1024 * 1024))
.memoryCacheSize(2 * 1024 * 1024)
.memoryCacheSizePercentage(13) // default
.diskCacheSize(50 * 1024 * 1024)
.diskCacheFileCount(100)
.diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
.imageDownloader(new BaseImageDownloader(mContext)) // default
.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
.writeDebugLogs()
.build();
return config;
}
在 HomeActivity:(和 OnCreate)[在每个 Activity 中我都这样称呼它]
initImageLoader();
private void initImageLoader(){
UniversalImageLoader universalImageLoader = new UniversalImageLoader(mContext);
ImageLoader.getInstance().init(universalImageLoader.getConfig());
}
当您创建 UniversalImageLoader class 的对象时,传递 getApplicationContext() 而不是 activity context .
应用程序上下文在整个应用程序中可用,而 activity 上下文绑定到 activity 生命周期。
更新:
Application Context:它是一个单例实例,可以通过 getApplicationContext() 在 activity 中访问。此上下文与应用程序的生命周期相关联。应用程序上下文可用于您需要其生命周期与当前上下文分离的上下文,或者当您传递超出 activity
范围的上下文时private void initImageLoader(){
UniversalImageLoader universalImageLoader = new UniversalImageLoader(getApplicationContext());
ImageLoader.getInstance().init(universalImageLoader.getConfig());
}
Activity 上下文 此上下文在 activity 中可用。此上下文与 activity 的生命周期相关联。
在此处详细了解 Activity 上下文和应用程序上下文的区别。 https://blog.mindorks.com/understanding-context-in-android-application-330913e32514
对于多个 Activity,您可以在 Application class onCreate 方法中进行初始化。
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// Initialize the Universal Image Loader here
DisplayImageOptions defaultOptions = new
DisplayImageOptions.Builder()
.cacheOnDisk(true).cacheInMemory(true).build();
ImageLoaderConfiguration config = new
ImageLoaderConfiguration.Builder(getApplicationContext())
.defaultDisplayImageOptions(defaultOptions).build();
ImageLoader.getInstance().init(config);
}
然后在你的 Activity 中获取像这样的图像加载器实例。
ImageLoader mImageLoader = ImageLoader.getInstance();
您还需要像这样在 AndroidManifest 中添加您的应用程序 class。
<application
android:name=".MyApplication"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"