请问一下正常流程执行surfaceView,surfaceCreated可以正常调用,SurfaceView预览界面写在XML文件中;但是试了下面两种方法surfaceCreated不会被调用,网上查了查,也没找到相关资料和说法,请问哪个大哥知道原理的?
方法一,使用handler延时加载
mHandler.postDelayed(new Thread() {
    public void run() {
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }
},10);
方法二,点击按钮加载
public void onClick(View view){
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
// 后来尝试发现使用动态加载SurfaceView可以解决这个问题,就是new一个SurfaceView对象,然后addView(mSurfaceView),但是还是不明白为什么SurfaceView在XML布局中。上述两种方法就不可行?哪位了解的大哥能不能讲一下原理?

解决方案 »

  1.   

    自己帮自己顶一个把,刚才debug调试了一下,发现正常流程中SurfaceView类中的变量mSurfaceCreated为false,而使用postDelay方式,刚开始就被设置为mSurfaceCreated = true,这样就导致了updateWindow方法中
                  if (visible && mSurface.isValid()) {
                            if (!mSurfaceCreated && (surfaceChanged || visibleChanged)) {
                                mSurfaceCreated = true;
                                mIsCreating = true;
                                if (DEBUG) Log.i(TAG, "visibleChanged -- surfaceCreated");
                                if (callbacks == null) {
                                    callbacks = getSurfaceCallbacks();
                                }
                                for (SurfaceHolder.Callback c : callbacks) {
                                    c.surfaceCreated(mSurfaceHolder);
                                }
                            }
                            
    进不去设置不callback无法执行