У меня есть приложение для Android, которое получает исключение NullPointerException на некоторых телефонах (все 2.3.x), но не на моем телефоне (также 2.3.x) или на любом из симуляторов.
Конкретное исключение, похоже, не дает никаких указаний на то, что оно происходит в моем коде, поэтому я предполагаю, что я звоню, что какая-то версия того же API-компонента неверна? Я не уверен, что с этим делать.
Вот журнал ошибок от logcat:
01-23 14:25:33.614: D/AndroidRuntime(25648): Shutting down VM
01-23 14:25:33.614: W/dalvikvm(25648): threadid=1: thread exiting with uncaught exception (group=0x4001d648)
01-23 14:25:33.634: E/AndroidRuntime(25648): FATAL EXCEPTION: main
01-23 14:25:33.634: E/AndroidRuntime(25648): java.lang.NullPointerException
01-23 14:25:33.634: E/AndroidRuntime(25648): at android.widget.TextView.onTouchEvent(TextView.java:7479)
01-23 14:25:33.634: E/AndroidRuntime(25648): at android.view.View.dispatchTouchEvent(View.java:3932)
01-23 14:25:33.634: E/AndroidRuntime(25648): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
01-23 14:25:33.634: E/AndroidRuntime(25648): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
01-23 14:25:33.634: E/AndroidRuntime(25648): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
01-23 14:25:33.634: E/AndroidRuntime(25648): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
01-23 14:25:33.634: E/AndroidRuntime(25648): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
01-23 14:25:33.634: E/AndroidRuntime(25648): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
01-23 14:25:33.634: E/AndroidRuntime(25648): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
01-23 14:25:33.634: E/AndroidRuntime(25648): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1784)
01-23 14:25:33.634: E/AndroidRuntime(25648): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1157)
01-23 14:25:33.634: E/AndroidRuntime(25648): at android.app.Activity.dispatchTouchEvent(Activity.java:2228)
01-23 14:25:33.634: E/AndroidRuntime(25648): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1759)
01-23 14:25:33.634: E/AndroidRuntime(25648): at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2352)
01-23 14:25:33.634: E/AndroidRuntime(25648): at android.view.ViewRoot.handleMessage(ViewRoot.java:1992)
01-23 14:25:33.634: E/AndroidRuntime(25648): at android.os.Handler.dispatchMessage(Handler.java:99)
01-23 14:25:33.634: E/AndroidRuntime(25648): at android.os.Looper.loop(Looper.java:150)
01-23 14:25:33.634: E/AndroidRuntime(25648): at android.app.ActivityThread.main(ActivityThread.java:4293)
01-23 14:25:33.634: E/AndroidRuntime(25648): at java.lang.reflect.Method.invokeNative(Native Method)
01-23 14:25:33.634: E/AndroidRuntime(25648): at java.lang.reflect.Method.invoke(Method.java:507)
01-23 14:25:33.634: E/AndroidRuntime(25648): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
01-23 14:25:33.634: E/AndroidRuntime(25648): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
01-23 14:25:33.634: E/AndroidRuntime(25648): at dalvik.system.NativeStart.main(Native Method)
Вот трассировка стека от отладчика:
Thread [<1> main] (Suspended (exception NullPointerException))
ViewRoot.handleMessage(Message) line: 1994
ViewRoot(Handler).dispatchMessage(Message) line: 99
Looper.loop() line: 150
ActivityThread.main(String[]) line: 4293
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 507
ZygoteInit$MethodAndArgsCaller.run() line: 849
ZygoteInit.main(String[]) line: 607
NativeStart.main(String[]) line: not available [native method]
Ошибка возникает сразу же, когда начинается действие, и хотя ни одна из отладочной информации не указывает нигде в моем коде, я предполагаю, что что-то в onCreate()
приведет к этому, поэтому вот onCreate()
для рассматриваемой операции:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.player);
int pid = getIntent().getIntExtra("pid", -1);
mCurrSlide = null;
myPresentation = thingListVideos.getVideoByPID(pid);
loading = ProgressDialog.show(Player.this, "...",
"downloading stuff", true, true);
video_handler = new Handler() {
public void handleMessage(Message msg) {
loading.dismiss();
Log.v(TAG, "Dismissed Dialog");
videoView = (VideoView) findViewById(R.id.VideoView);
prepareVideoView(videoView);
videoView.requestFocus();
}
};
new Thread(new Runnable() {
@Override
public void run() {
mCurrSlideThread = new Thread() {
public void run() {
getTiming();
videoView.postDelayed(mCurrSlideThread, 1000);
}
};
sView = (LinearLayout) findViewById(R.id.LayoutS);
prepare(slideView);
video_handler.sendEmptyMessage(0);
}
}).start();
}
Я знаю, что на самом деле он не выполняет никакой работы, которую он будет выполнять в новом потоке, который он создает в конце, так как диалог прогресса никогда не появляется, и он регистрирует работу, которую он выполняет, если он это сделал. (и действительно, когда я запускаю его на своем телефоне или на симуляторе).
Я несколько новичок в Android и не знаю, что может быть причиной этого или почему это происходит на некоторых устройствах, а не на других, даже если у них должны быть идентичные версии API Android. Если кто-то видел что-то подобное раньше или имеет представление о том, что может быть причиной этого, некоторые указания относительно того, где искать, будут очень благодарны.