我使用以下代码获得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)
谢谢,
答案 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);