某些手机​​上的NullPointerException,而不是其他手机(相同的API级别)

时间:2012-01-24 03:59:00

标签: android nullpointerexception android-handler

我有一个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。如果有人之前已经看过这样的东西,或者知道可能导致它的原因,那么关于去哪里看的一些指示将非常感激。

1 个答案:

答案 0 :(得分:0)

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

不应该在onCreate中启动线程,因为你正在参与活动启动序列。使用AsyncTask将是一个更好的方法;系统为您管理线程!

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

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