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!