【问题标题】:getPackageName() returns nullgetPackageName() 返回 null
【发布时间】:2014-02-28 08:02:59
【问题描述】:

我的 android 应用程序中有一个方法,它根据它的名称返回 drawable id,这个方法在正常情况下运行良好,但是当从单独的线程运行它时,它返回 @987654321 @,即使在 UIThread 上运行此线程。

这个方法是:

public int get_drawable(int status){
     int res;
     res = getResources().getIdentifier("something"+ Integer.toString(status) , "drawable", getPackageName()); // this is the line which throws the Exception
     return res;
}

还有例外:

02-04 13:43:14.644: WARN/System.err(594): java.lang.NullPointerException
02-04 13:43:14.664: WARN/System.err(594):     at android.content.ContextWrapper.getResources(ContextWrapper.java:81)
02-04 13:43:14.664: WARN/System.err(594):     at com.example.solaceap.HomeView.get_drawable(HomeView.java:525)
02-04 13:43:14.674: WARN/System.err(594):     at com.example.solaceap.JSONParsing.alter_light(JSONParsing.java:689)
02-04 13:43:14.674: WARN/System.err(594):     at com.example.solaceap.JSONParsing.parse_hmm_response(JSONParsing.java:297)
02-04 13:43:14.674: WARN/System.err(594):     at com.example.solaceap.JSONParsing.check_hmm_type(JSONParsing.java:218)
02-04 13:43:14.684: WARN/System.err(594):     at com.example.solaceap.JSONParsing.parse_hmm_response(JSONParsing.java:170)
02-04 13:43:14.684: WARN/System.err(594):     at com.example.solaceap.Login.parse_response(Login.java:143)
02-04 13:43:14.704: WARN/System.err(594):     at com.example.solaceap.Login.response_received(Login.java:129)
02-04 13:43:14.704: WARN/System.err(594):     at com.example.solaceap.Login$2$1.run(Login.java:106)
02-04 13:43:14.714: WARN/System.err(594):     at android.os.Handler.handleCallback(Handler.java:605)
02-04 13:43:14.724: WARN/System.err(594):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-04 13:43:14.724: WARN/System.err(594):     at android.os.Looper.loop(Looper.java:137)
02-04 13:43:14.724: WARN/System.err(594):     at android.app.ActivityThread.main(ActivityThread.java:4340)
02-04 13:43:14.724: WARN/System.err(594):     at java.lang.reflect.Method.invokeNative(Native Method)
02-04 13:43:14.724: WARN/System.err(594):     at java.lang.reflect.Method.invoke(Method.java:511)
02-04 13:43:14.724: WARN/System.err(594):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
02-04 13:43:14.734: WARN/System.err(594):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-04 13:43:14.734: WARN/System.err(594):     at dalvik.system.NativeStart.main(Native Method)

更新:

在做了一些尝试后,我发现getPackageName() 是引发异常的那个,即使尝试静态提供我的资源包名称它也会给我相同的结果。

HomeView 是我的 android 应用程序中的一个 Activity 类,但 JSONParsing 类是一个普通的 java 类,它从 HomeView 调用此方法。

【问题讨论】:

  • @MD 只是我将它定义为我的应用程序中的最终字符串,感谢那个通知我在问题中替换了它
  • 除了Integer.toString(status)之外,尝试获取字符串中的整数值为Integer.parseInt(status)
  • 尝试context.getPackageName(),将上下文传递给此方法并执行此操作
  • 问题是你什么时候开始新线程?也许您从中获取包名称的上下文尚未正确创建。
  • @MRefaat 只有一个 UI 线程 - 无需启动新线程。反正。您需要正确中断线程和处理程序中断。

标签: android resources android-resources ui-thread getresource


【解决方案1】:

来自

    res = getResources().getIdentifier("something"+ Integer.toString(status) , "drawable", getPackageName()); 

似乎最有可能:检查状态的值(如果状态=12)并确保您有一个名为“something12”的drawable。

..用 context.getPackageName 或 getApplicationContext.getPackageName 检查包名。可以使用 status 参数传递上下文以确保其不为空

“res”对你来说是空的,所以上下文是空的(不正确的包名称 - 可以尝试在“”中传递包名称,如“drawable”)或者没有与正在传递的文本匹配的drawable名称

【讨论】:

  • 我发现包名是问题所在,它是引发该异常的原因,但即使在我的应用程序资源包名在引号内更改getPackageName() 之后,它也只是遵循相同的行为(运行通常在第一次尝试再次访问时抛出该异常)
【解决方案2】:

堆栈跟踪表明异常发生在ContextWrapper.getResources()。如果基本上下文为空,它只能 NPE。

如果您尝试在活动onCreate() 之前调用该方法,则基本上下文可以为空。您不能将活动用作Context,直到onCreate() 在其生命周期中。

此外,您不能使用new 实例化活动,因为所有设置代码都涉及例如设置上下文资源将不会运行。

为了获得更好的答案,我们需要知道 HomeView 是什么以及您如何实际实例化它。

【讨论】:

  • 可能,可能不是 - 请在问题中添加完整的堆栈跟踪。
  • 堆栈跟踪不符合getPackageName() 理论。
  • 我之前只是尝试在一行中获取包名,并在该行获得了相同的堆栈跟踪
  • 是的,也没有为getPackageName() 设置基本上下文。活动未正确初始化为Context
  • HomeView 是我的 android 应用程序中的一个 Activity 类,但 JSONParsing 类是一个普通的 java 类,它从 HomeView 调用此方法。
【解决方案3】:

尝试如下:

getResources().getIdentifier("something"+ Integer.toString(status) , "drawable", this.getPackageName().toString());

【讨论】:

  • 由于字符串连接运算符,每次整数到字符串的转换都是无用的
  • 我猜你需要提供this.getResources()..
  • 试试MainActivity.this.getPackageName().toString(); 在哪里更改您的活动名称而不是MainActivity。 @MRefaat
猜你喜欢
  • 2018-10-14
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 1970-01-01
  • 2020-06-19
相关资源
最近更新 更多