0

我有一个 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。如果有人以前见过这样的事情或知道是什么原因造成的,那么一些关于在哪里看的指针将不胜感激。

4

1 回答 1

0

由于您是故意设置竞争条件,因此您必须为您的控制等做好准备,以使其尚不存在。时间就是一切,这就是它“在我的机器上工作”的原因。

不应该启动线程onCreate因为您正在与活动启动序列竞争。使用 anAsyncTask会是更好的方法;系统为您管理线程!

和方法是您应该进行线程管理的地方onPauseonResume这些是在您的活动被遮蔽和未被遮蔽时发生的生命周期事件。对于非 UI 处理,您可以使用onStartonStop因此您可以获得更多处理,但不适用于与 UI 相关的内容。

“检查null”建议仍然适用。

于 2012-01-24T12:51:14.190 回答