本帖最后由 j313469458 于 2014-10-06 19:35:30 编辑

解决方案 »

  1.   

    你确定你这份代码是全的吗?在你这份代码里有 setMapMode(View)得方法,但是实际上在你的代码里,我没有看到哪个位置调用了他的
      

  2.   

    在setTraffic(View view)插入断电、然后你可以看到以下的栈信息,因为是先进后出,执行顺序是从下面主线程的main()开始执行LayersDemo.setMapMode(View) line: 37
    Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
    Method.invoke(Object, Object...) line: 515
    View$1.onClick(View) line: 3850
    RadioButton(View).performClick() line: 4470
    RadioButton(CompoundButton).performClick() line: 100
    View$PerformClick.run() line: 18593
    Handler.handleCallback(Message) line: 733
    ViewRootImpl$ViewRootHandler(Handler).dispatchMessage(Message) line: 95
    Looper.loop() line: 157
    ActivityThread.main(String[]) line: 5867 执行步骤大概是:ViewRootHandler分发消息过来,触发View的点击事件,然后得知这个View是RadioButton类型(继承View而来),接着是Method.invokeNative,这个不用管,这里面执行的是c/c++的代码,估计是百度在算法方面做跨平台节省开发成本,iOS也是用这里面的代码,重点来了,setTraffic(View view)是怎么传View的?我找到了这个代码        <CheckBox
                android:id="@+id/traffice"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:checked="false"
                android:onClick="setTraffic"
                android:text="交通图" />也就是里面onClick="setTraffic"起的作用,Activity里面有执行setContentView(R.layout.activity_layers);这里执行的其实是一个解析xml和然后根据解析结果调用Java代码的过程,当读到<CheckBox..../>这段代码的时候就会在渲染树里面new一个CheckBox对象,当读到android:onClick="setTraffic"这句属性的时候会执行
    checkBox.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View view) {
    // TODO Auto-generated method stub
    Activity.this.setTraffic(view);
    }
    })
    这样就把View传进来来,其实Activity.this.setTraffic(view);也不是这么直接执行的,我这里写的就当是伪代码吧,应该是JVM虚拟机有个查找函数的机制,根据"setTraffic"这个名字去查找当前Activity的setTraffic成员函数,如果找不到这个函数执行到这里报错崩溃,希望你能理解起初我也不懂这些机制,也是弄游戏开发后才慢慢懂得GUI框架大概的原理,以前也好奇XML是怎么表现成界面的,其实最终还是动态调用Java代码实现,搭成一棵渲染树一层层得把每个View渲染出来