getPackageName()返回null

时间:2014-02-04 11:19:23

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

我的Android应用程序中有一个方法根据它的名称返回 drawable id ,这种方法在正常情况下工作得很好,但是当从单独的线程运行它时会返回{{ 1}},即使在Null上运行此线程。

此方法为:

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) 是抛出Exception的那个,即使试图静态地提供我的资源包名,它也给了我相同的结果。

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

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

来自

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

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

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

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

答案 2 :(得分:0)

试试如下:

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