Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android在处理程序递归上出现空点问题_Java_Android_Recursion_Nullpointerexception_Handler - Fatal编程技术网

Java Android在处理程序递归上出现空点问题

Java Android在处理程序递归上出现空点问题,java,android,recursion,nullpointerexception,handler,Java,Android,Recursion,Nullpointerexception,Handler,我有一个空指针异常,代码如下: void videoCaptureLoop() { if (!isRecording) { if (videoCaptureThread != null){ videoCaptureThread.interrupt(); videoCaptureThread = null; } return; } //Start Video Capture

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

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();
    }
}
麻烦的是,我不确定什么是空的,我在里面放了一个断点,但一切看起来都很好,直到它崩溃,我在崩溃前的断点处看不到任何不同

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

错误


谢谢,

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

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

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

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

Android为此提供了一个类,HandlerThread。手柄线很好,因为它们安装了活套。可以使用该循环器创建将在新线程上运行的处理程序。您还可以为新线程命名,这可能会有所帮助

像这样的事情应该会让你行动起来:

//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);

但是它是公共的,不是所有变量都在线程之间共享吗?我该如何着手修理它呢?我只想创建一个循环,让它在主UI上运行runnable。是的,但是您创建了VideoCaptureLooperThread的新实例了吗?(我想您已经)并且您是否执行了run(){}代码?上面的Answare应该可以修复它。这都在“//Start视频捕获线程”调用线程下。Start()调用线程。run()。。。我认为您可能是正确的,在调用线程(UI)调用mhandler.postDelay(…)之前,视频线程可能不会运行VideoThread.run(),但我不知道,如果视频线程尚未启动,我将检查VideoThread.mhandler==null并在主UI线程上发布延迟。我会让你知道的。是的,这是正确的,不管怎样,我在答案中添加了我注释过的代码,并将其作为正确的解决方案进行了检查,感谢这可能会起作用,但正如你所写的,mHandler将是与实例化VideoCaptureLooperThread的线程相关联的循环器上的处理程序。无论如何,我想我得到了这个,有一个错误可能与这个线程有关,但是空指针错误被忽略了,
public class VideoCaptureLooperThread extends Thread {
    public Handler mHandler = new Handler();
    public void run() {
        Looper.prepare();
        Looper.loop();
    }
}
//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);