我有一个 Android 应用程序在某些手机(所有 2.3.x)上获得 NullPointerException,但在我的手机(也是 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 有点陌生,我不知道是什么原因造成的,也不知道为什么它会发生在某些设备上而不是其他设备上,即使它们应该具有相同版本的 android API。如果有人以前见过这样的事情或知道是什么原因造成的,那么一些关于在哪里看的指针将不胜感激。