我的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
调用此方法。
答案 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());