【问题标题】:Creating thread in ViewRootImpl.java在 ViewRootImpl.java 中创建线程
【发布时间】:2017-02-03 15:08:07
【问题描述】:

我正在尝试在 ViewRootImpl.java 中创建一个带有 looper 和处理程序的线程,但我收到了这个错误:

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

我不能在这个文件中创建线程吗?

另一个问题:每个应用程序都有自己的框架副本吗?这对 android 框架有什么作用?

谢谢

【问题讨论】:

  • 那你为什么不使用HandlerThread呢? HandlerThread ht = new HandlerThread("foo thread"); ht.start(); Handler h = new Handler(ht.getLooper()) {... 更多 stackoverflow.com/a/25096981/2252830
  • @pskink 我会尝试这种方式。问题是,构建源代码树需要五个小时,因为我不能只构建框架模块。我正在等待它完成,然后我会尝试。
  • 五个小时???单个文件更改?
  • @pskink 我遇到了这个问题 (stackoverflow.com/questions/41926906/…),这是解决它的唯一方法。我已经尝试过使用 DEXPREOPT 的解决方案,但它不起作用

标签: java android multithreading android-os-handler


【解决方案1】:

mVthread.mhandlernull

在没有正确同步的情况下调用start() 后,您不能依赖run() 内部发生的事情。

当您阅读mhandler 时,很可能该线程尚未启动。

mhandler = new Handler()... 移动到 Vthread 构造函数。

【讨论】:

  • 我想我需要在 Looper.prepare() 调用之后创建处理程序
  • 在这种情况下你会得到一个例外。
  • "当你阅读 mhandler 时,很可能线程还没有启动。"这就是问题所在。谢谢
猜你喜欢
  • 2011-02-23
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多