2017-02-03 6 views
1

内のスレッドを作成:私はViewRootImpl.javaでルーパーとハンドラとスレッドを作成しようとしているが、私はこのエラーを取得してい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 

私のコードはperformTraversals機能であり、ちょうどスレッド間でメッセージを送信します。ここに私のコードは次のとおりです。

クラス:

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

コードが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); 

は、私は、このファイルにスレッドを作成することはできませんよ?

もう1つの質問:各アプリケーションには独自のフレームワークのコピーがありますか?これはアンドロイドフレームワークのためにどのように機能しますか?

おかげ

+0

なぜあなたは 'HandlerThread'を使用しませんか? 'HandlerThread ht = new HandlerThread(" foo thread "); ht.start();ハンドラh =新しいハンドラ(ht.getLooper()){... 'もっと詳しくはこちらhttp://stackoverflow.com/a/25096981/2252830 – pskink

+0

@pskinkそのようにします。つまり、フレームワークモジュールだけを構築することができないので、ソースツリーを構築するのに5時間かかります。私はそれが終わるのを待っているし、私は試してみる。 –

+0

5時間??? 1つのファイルが変更された場合 – pskink

答えて

0

mVthread.mhandlernullです。

start()を適切に同期化せずに呼び出すと、run()の内部で何が起こるかに頼ることはできません。

mhandlerを読むと、スレッドがまだ開始されていない可能性があります。

mhandler = new Handler()...Vthreadコンストラクタに移動します。

+0

Looper.prepare()の呼び出し後にハンドラを作成する必要があると思います。 –

+0

スレッドが作成されていない可能性はありますか? –

+0

この場合、例外が発生します。 – rustyx

関連する問題