Java在处理程序递归时出现零点问题

时间:2013-09-28 23:14:48

标签: java android recursion nullpointerexception handler

我使用以下代码获得Null Pointer异常:

void videoCaptureLoop() {
    if (!isRecording) {
        if (videoCaptureThread != null){
            videoCaptureThread.interrupt();
            videoCaptureThread = null;
        }  
        return;
    }

    //Start Video Capture Thread
    if (videoCaptureThread==null){
        videoCaptureThread = new VideoCaptureLooperThread();
        videoCaptureThread.start();
    }

    //Post capture video on 30 fps interval <<<<--------------NULL POINTER ON NEXT LINE
    videoCaptureThread.mHandler.postDelayed(runVideoCaptureLoop, (long) 33.3333333333);
}   

Runnable runVideoCaptureLoop = new Runnable(){
    @Override
    public void run() {
        videoCaptureLoop();
    }
};      

public class VideoCaptureLooperThread extends Thread{
    public Handler mHandler;
    public void run() {
        Looper.prepare();
        mHandler = new Handler();
        Looper.loop();
    }
}

我一直在线上获得Null Pointer Exception:

 videoCaptureThread.mHandler.postDelayed(runVideoCaptureLoop, (long) 33.3333333333);

麻烦的事情是我不确定什么是空的,我给了一个断点,但是一切都看起来很好,直到它崩溃,我在崩溃前的断点处看不到任何不同。< / p>

我的VideoCaptureLooperThread类看起来是否正确?它与mHandler有什么关系需要静态吗?

错误

09-28 15:50:32.773: E/AndroidRuntime(24931): FATAL EXCEPTION: main
09-28 15:50:32.773: E/AndroidRuntime(24931): java.lang.NullPointerException
09-28 15:50:32.773: E/AndroidRuntime(24931):    at com.harmonicprocesses.penelopefree.camera.Pcamera.videoCaptureLoop(Pcamera.java:380)
09-28 15:50:32.773: E/AndroidRuntime(24931):    at com.harmonicprocesses.penelopefree.camera.Pcamera$2.onClick(Pcamera.java:338)
09-28 15:50:32.773: E/AndroidRuntime(24931):    at android.view.View.performClick(View.java:4240)

谢谢,

3 个答案:

答案 0 :(得分:1)

mHandler给出nullpointer。 mHandler似乎只在VideoCaptureLooperThread中声明。 在videoCaptureLoop()中,它位于videoCaptureLoop之外,您正在引用mHandler。

答案 1 :(得分:1)

您在调用方法mHandler之前访问run,因此mHandler尚未初始化。尝试在声明本身中初始化它.-

public class VideoCaptureLooperThread extends Thread {
    public Handler mHandler = new Handler();
    public void run() {
        Looper.prepare();
        Looper.loop();
    }
}

答案 2 :(得分:0)

您的问题是您在新线程启动并初始化mHandler之前调用videoCaptureThread.mHandler。

Android为此提供了一个类HandlerThread。 HandlerThreads很好,因为它们是用Looper实现的。您可以使用该Looper创建一个将在新线程上运行的Handler。您还可以命名新线程,这可能会有所帮助。

这样的事情应该让你前进:

//Start Video Capture Thread
if (videoCaptureThread==null||videoCaptureHandler==null){
    videoCaptureThread = new HandlerThread("VideoCapture");
    videoCaptureThread.start();
    videoCaptureHandler = new Handler(videoCaptureThread.getLooper());
}

videoCaptureHandler.postDelayed(runVideoCaptureLoop, (long) 33.3333333333);