0

У меня есть метод в моем приложении для Android, который возвращает идентификатор в соответствии с его именем, этот метод работает так хорошо в обычных случаях, но при запуске его из отдельного потока он возвращает Null, даже при запуске этой нити на UIThread.getPackageName() возвращает null

Этот метод:

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

И Exception:

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) 

UPDATE:

после выполнения некоторых попыток я нашел, что getPackageName() является один который бросает Exce ption, даже если попытаться статически предоставить имя моего ресурса, это дает мне тот же результат.

HomeView - класс активности в моем приложении для Android, но класс JSONParsing - это нормальный класс java, который вызывает этот метод из HomeView.

+0

@MD это просто я определил его как последнюю строку в моем приложении, thx для этого уведомления я заменил его в вопросе – MRefaat

+0

Попробуйте получить целочисленное значение в строке как 'Integer.parseInt (status)' кроме 'Integer.toString (status)' – GrIsHu

+1

try 'context.getPackageName()', передать контекст этому методу и сделать это –

ответ

0

Попробуйте, как показано ниже:

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

, так как оператор конкатенации строк, любое целочисленное преобразование строки бесполезно – Blackbelt

+0

ничего не изменилось – MRefaat

+0

Думаю, вам нужно предоставить 'this.getResources() ..' – GrIsHu

1

StackTrace говорит исключение происходит в ContextWrapper.getResources(). Это может быть только NPE, если базовый контекст равен нулю.

Базовый контекст может быть пустым, если вы пытаетесь вызвать метод перед вашей деятельностью. onCreate(). Вы не можете использовать активность как Context до onCreate() в своем жизненном цикле.

Кроме того, вы не можете создавать операции с new как все установочные коды, например, настройка контекстных ресурсов не будет выполняться.

Для лучшего ответа нам нужно знать, что такое HomeView и как вы его создаете.

+0

, но эта деятельность уже создана, прежде чем называть ее. – MRefaat

+0

Возможно, возможно, нет - добавьте полный стек к вопросу. – laalto

+0

Хорошо, я разместил его – MRefaat

1

От

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

Кажется, скорее всего: проверьте значение статуса (если статус = 12) и убедитесь, что у вас есть вытяжка с именем «something12».

..Посмотреть имя пакета с помощью context.getPackageName или getApplicationContext.getPackageName. Может передать контекст с параметром статуса, чтобы убедиться, что его значение не определено.

«res» для вас равно нулю, так что либо контекст имеет значение null (неправильное имя пакета - можно попробовать передать имя пакета в «» как «drawable») или нет имени подходящего для передаваемого текста.

+0

Я понял, что имя пакета является проблемой, и это то, что выдает это исключение, но даже после изменения 'getPackageName()' с моим именем пакета ресурсов приложения внутри кавычек оно просто подчиняется одному и тому же поведению (работает нормально в первый раз затем бросает это исключение при попытке получить к нему доступ снова) – MRefaat