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