【问题标题】:Why do I get this "Context = NullPointerException" error in my homework? [duplicate]为什么我的作业中会出现“Context = NullPointerException”错误? [复制]
【发布时间】:2019-10-17 20:35:35
【问题描述】:

我正在做一个家庭作业教程,即构建一个 Instagram 应用程序。该教程大约有两年的历史,我在编码方面遇到了一些问题。

我遇到以下错误,不知道为什么。

 java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference

我的 UniversalImageLoader 类

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());
    }

【问题讨论】:

  • 分享方法getConfig()的调用。您是否初始化了通用图像加载器 sdk?这是供参考的设置指南github.com/nostra13/Android-Universal-Image-Loader/wiki/…
  • 显然,mContextnull。这意味着您将 null 传递给了 UniversalImageLoader 类。
  • @TheAnkush...在哪里?我必须打电话吗?根据我需要在 MAinActivity.class 中执行的指南...我现在调用它它无法打开 Activity...
  • @CommonsWare...这听起来很愚蠢,但我需要传递给它什么?
  • 你需要传递一个Context。由于这似乎正在加载图像,因此您的 Activity 似乎很可能是 Context

标签: java android universal-image-loader


【解决方案1】:

当你创建 UniversalImageLoader 类的对象时,传递 getApplicationContext() 而不是 activity context

应用程序上下文在整个应用程序中可用,而活动上下文绑定到活动生命周期。

更新:

Application Context:它是一个单例实例,可以通过getApplicationContext()在activity中访问。此上下文与应用程序的生命周期相关联。应用程序上下文可用于您需要一个生命周期与当前上下文分开的上下文,或者当您传递一个超出活动范围的上下文时

private void initImageLoader(){
    UniversalImageLoader universalImageLoader = new UniversalImageLoader(getApplicationContext());
    ImageLoader.getInstance().init(universalImageLoader.getConfig());
}

活动上下文此上下文在活动中可用。此上下文与活动的生命周期相关联。

在这里阅读更多关于 Activity 上下文和应用程序上下文的区别。 https://blog.mindorks.com/understanding-context-in-android-application-330913e32514

对于多个活动,您可以在 Application 类的 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 中添加您的应用程序类。

<application
    android:name=".MyApplication"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"

【讨论】:

  • 感谢您的信息...这没有任何意义...请您解释一下使用示例代码 sn-p...
  • @BenVanJaarsveld - 我已经用代码更新了我的答案。观察我是如何初始化通用图像加载器的。你分享的sn-p代码,mContext的值不清楚。我相信你可能已经设置了 mContext = 。这个。
猜你喜欢
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多