0

我有一个空指针异常,代码如下:

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();
    }
}

我不断收到空指针异常:

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

麻烦的是我不确定什么是空的,我放了一个断点但一切看起来都很好,直到它崩溃,而且我无法在崩溃前的断点看到任何不同的东西。

我的 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)

谢谢,

4

3 回答 3

1

您在调用mHandler方法之前访问,因此尚未初始化。尝试在声明本身中对其进行初始化。-runmHandler

public class VideoCaptureLooperThread extends Thread {
    public Handler mHandler = new Handler();
    public void run() {
        Looper.prepare();
        Looper.loop();
    }
}
于 2013-09-28T23:36:37.840 回答
1

mHandler 给出空指针。mHandler 似乎只在 VideoCaptureLooperThread 中声明。在 videoCaptureLoop 之外的 videoCaptureLoop() 中,您指的是 mHandler。

于 2013-09-28T23:22:22.580 回答
0

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

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

这样的事情应该让你去:

//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);
于 2013-09-29T19:04:49.110 回答