I'm trying to create a thread with a looper and an handler in ViewRootImpl.java but I'm getting this error:
02-03 14:04:14.266 884 884 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.os.Handler.sendMessage(android.os.Message)' on a null object reference
02-03 14:04:14.266 884 884 E AndroidRuntime: at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1344)
02-03 14:04:14.266 884 884 E AndroidRuntime: at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1150)
02-03 14:04:14.266 884 884 E AndroidRuntime: at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6076)
02-03 14:04:14.266 884 884 E AndroidRuntime: at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
02-03 14:04:14.266 884 884 E AndroidRuntime: at android.view.Choreographer.doCallbacks(Choreographer.java:670)
02-03 14:04:14.266 884 884 E AndroidRuntime: at android.view.Choreographer.doFrame(Choreographer.java:606)
02-03 14:04:14.266 884 884 E AndroidRuntime: at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
02-03 14:04:14.266 884 884 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:739)
02-03 14:04:14.266 884 884 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
02-03 14:04:14.266 884 884 E AndroidRuntime: at android.os.Looper.loop(Looper.java:148)
02-03 14:04:14.266 884 884 E AndroidRuntime: at com.android.server.SystemServer.run(SystemServer.java:283)
02-03 14:04:14.266 884 884 E AndroidRuntime: at com.android.server.SystemServer.main(SystemServer.java:168)
02-03 14:04:14.266 884 884 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
02-03 14:04:14.266 884 884 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
02-03 14:04:14.266 884 884 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
02-03 14:04:14.348 884 884 I Process : Sending signal. PID: 884 SIG: 9
My code is in performTraversals function and just send messages between the threads. Here is my code:
The classes:
public class Viewhandler extends Handler{
Viewhandler(){}
@Override
public void handleMessage(Message msg) {
Log.v("Viewhandler","msg-" + msg.arg1);
}
}
public class Vthread extends Thread{
Viewhandler mViewhandler;
Handler mhandler;
Vthread(Viewhandler handler){
mViewhandler = handler;
}
@Override
public void run(){
Looper.prepare();
mhandler = new Handler(){
@Override
public void handleMessage(Message msg) {
Log.v("Vthread","msg-" + msg.arg1);
Message mes = Message.obtain();
mes.arg1 = 2000;
mViewhandler.sendMessage(mes);
}
};
Looper.loop();
}
}
The code in performTraversals function:
if(mViewhandler == null){
Log.v(TAG, "viewhandler");
mViewhandler = new Viewhandler();
}
if(mVthread == null){
Log.v(TAG, "vthread");
mVthread = new Vthread(mViewhandler);
mVthread.start();
}
Log.v(TAG, "message");
Message msg = Message.obtain();
msg.arg1 = 1000;
mVthread.mhandler.sendMessage(msg);
Am I not able to create threads in this file?
Another questions: Does each application have its own copy of frameworks? How does this work for android frameworks?
Thanks
mVthread.mhandler
isnull
.You can't rely on what happens inside
run()
after you calledstart()
without proper synchronization.Most likely the thread hasn't been started yet when you are reading
mhandler
.Move
mhandler = new Handler()...
to theVthread
constructor.