[英]Creating thread in ViewRootImpl.java
I'm trying to create a thread with a looper and an handler in ViewRootImpl.java but I'm getting this error: 我正在尝试使用浏览器和ViewRootImpl.java中的处理程序创建一个线程,但我收到此错误:
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. 我的代码在performTraversals函数中,只是在线程之间发送消息。 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: performTraversals函数中的代码:
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? 这对android框架有什么用?
Thanks 谢谢
mVthread.mhandler
is null
. mVthread.mhandler
为null
。
You can't rely on what happens inside run()
after you called start()
without proper synchronization. 在没有正确同步的情况下调用start()
之后,你不能依赖run()
内发生的事情。
Most likely the thread hasn't been started yet when you are reading mhandler
. 当您阅读mhandler
时,很可能还没有启动该线程。
Move mhandler = new Handler()...
to the Vthread
constructor. 将mhandler = new Handler()...
到Vthread
构造函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.