Creating thread in ViewRootImpl.java

1.3k Views Asked by At

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

1

There are 1 best solutions below

3
On BEST ANSWER

mVthread.mhandler is null.

You can't rely on what happens inside run() after you called start() without proper synchronization.

Most likely the thread hasn't been started yet when you are reading mhandler.

Move mhandler = new Handler()... to the Vthread constructor.