2
votes

I am studying Android Game Development these days. I come across a problem about SurfaceView\SurfaceHolder. When I read the source code of View/SurfaceView.java in android sdk 22, I am confused. following is the code:

public class SurfaceView extends MockView {
    ...    
    public SurfaceHolder getHolder() {
        return mSurfaceHolder;
    }

    private SurfaceHolder mSurfaceHolder = new SurfaceHolder() {
        ...

        @Override
        public Surface getSurface() { return null; }
        @Override
        public Canvas lockCanvas() { return null; }
        ...

    }
}

I know, mSurfaceHolder.getSurface()\lockCanvas are very important, but it returns null! So, I think this mSurfaceHolder may be dealt with some other steps. But I have learned an example about SurfaceView, but I didn't figout out any special steps to deal with mSurfaceHolder, the example's code is as following:


public class SurfaceViewTest extends Activity {

    String TAG = "SurfaceViewTest";
    FastRenderView surfaceView = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_surface_view_test);
        surfaceView = new FastRenderView(this);
        setContentView(surfaceView);
    }

    @Override
    protected void onResume() {
        super.onResume();
        surfaceView.doResume();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is  
        // present.
        getMenuInflater().inflate(R.menu.menu_surface_view_test, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    /**
     * customized surfaceview class
     */
    public class FastRenderView extends SurfaceView implements Runnable {

        boolean running = false;
        SurfaceHolder holder = null;
        Thread thread = null;

        public FastRenderView(Context context) {
            super(context);
            // holder
            // getHolder() returns a SurfaceHolder implementation, it
            // isn't null, but it contains nothing.
            holder = getHolder();
            if (holder == null)
                Log.e(TAG, "failed to get valid holder");

        }

        public void doResume() {
            thread = new Thread(this);
            thread.start();
            running = true;
        }

        public Random rand = new Random();
        @Override
        public void run() {
            while (running) {
                // from android sdk 22, SurfaceView.java, we can see, this
                // holder's getSurface() returns null.
                // but why? it returns null, so here it an exception 
                // should be thrown out!
                if (!holder.getSurface().isValid()) {
                    continue;
                }

                Canvas canvas = holder.lockCanvas();
                if (canvas == null) {
                    Log.e(TAG, "get an invalid canvas to draw");
                    continue;
                }
                canvas.drawRGB(
                    rand.nextInt(255), 
                    rand.nextInt(255), 
                    rand.nextInt(255));
                holder.unlockCanvasAndPost(canvas);

                // sleep
                try {
                    Thread.sleep(1000);
                }
                catch(Exception e) {
                    e.printStackTrace();
                }
            }
            Log.i(TAG, "running ...");
        }

        public void doPause() {

            running = false;
            while (true) {
                try {
                    thread.join();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

Thanks in advance!

1

1 Answers

1
votes

I'm afraid you refer to the wrong source code. the code of SurfaceView you post is from layoutlib not the real framework source code, the source code of SurfaceView is here