title: Application error when drawing to SurfaceView
body: <p>I'm am doing a simple coding attempt trying to draw on a SurfaceView created on my main.xml layout. I can change background color and display an icon fine, but when I try to draw I get an error. I am a newbie so obvious I am missing something, please lend a helping hint, thanks!</p>
  
  <p>main.xml</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/root" android:orientation="vertical"
      android:layout_width="fill_parent" android:layout_height="fill_parent"&gt;
  
          &lt;SurfaceView android:id="@+id/Paper"
              android:layout_height="fill_parent" 
              android:layout_width="fill_parent"&gt;
          &lt;/SurfaceView&gt;
  
  &lt;/LinearLayout&gt;
  </code></pre>
  
  <p>and code here;</p>
  
  <pre><code>package com.example.SurfaceViewTest;
  
  import android.app.Activity;
  import android.graphics.Bitmap;
  import android.graphics.Canvas;
  import android.graphics.Color;
  import android.graphics.Paint;
  import android.os.Bundle;
  import android.view.SurfaceHolder;
  import android.view.SurfaceView;
  
  public class SurfaceViewTest extends Activity implements SurfaceHolder.Callback {
  
      private SurfaceView mSurfaceView;
      private SurfaceHolder mSurfaceHolder;
      private Paint paint;
      Bitmap mDrawing;
  
      boolean mRun;
  
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
  
          setContentView(R.layout.main);
  
          mSurfaceView = (SurfaceView) this.findViewById(R.id.Paper);
  
          mSurfaceHolder = mSurfaceView.getHolder();
  
          mSurfaceHolder.addCallback(this);
  
          mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL);
      }
  
      @Override
      public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
          // TODO Auto-generated method stub
      }
  
      @Override
      public void surfaceCreated(SurfaceHolder holder) {
          mSurfaceView.setBackgroundColor(Color.rgb(0, 255, 0));
          mRun=true;
          thread.start();
      }
  
      @Override
      public void surfaceDestroyed(SurfaceHolder holder) {
          // TODO Auto-generated method stub
      }
  
      Thread thread = new Thread(){
  
          public void doDraw(Canvas c){
              mDrawing = Bitmap.createBitmap(200, 300, Bitmap.Config.RGB_565);
  
              c.setBitmap(mDrawing);
  
              paint = new Paint();
              paint.setColor(Color.rgb(255, 255,255));
  
              c.drawLine(1,1,200,300, paint);
          }
  
          public void run() {
              while (mRun) {
                  Canvas c = null;
                  try {
                      c = mSurfaceHolder.lockCanvas(null);
                      synchronized (mSurfaceHolder) {
                          doDraw(c);
                      }
                  } finally {
                      // do this in a finally so that if an exception is thrown
                      // during the above, we don't leave the Surface in an
                      // inconsistent state
                      if (c != null) {
                          mSurfaceHolder.unlockCanvasAndPost(c);
                      }
                  }
              }
          }
      };
  }
  </code></pre>
  
  <p>UPDATE:</p>
  
  <p>Ok I got it to works thanks!</p>
  
  <pre><code>package com.example.SurfaceViewTest;
  
  import android.app.Activity;
  import android.graphics.Bitmap;
  import android.graphics.Canvas;
  import android.graphics.Color;
  import android.graphics.Paint;
  import android.os.Bundle;
  import android.view.SurfaceHolder;
  import android.view.SurfaceView;
  
  public class SurfaceViewTest extends Activity implements SurfaceHolder.Callback {
  
      private SurfaceView mSurfaceView;
      private SurfaceHolder mSurfaceHolder;
      Bitmap mDrawing;
      Canvas tempCanvas = new Canvas();
      Paint paint;
  
      boolean mRun;
  
      int intCanvasWidth, intCanvasHeight;
  
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
  
          setContentView(R.layout.main);
  
          mSurfaceView = (SurfaceView) this.findViewById(R.id.Paper);
          mSurfaceHolder = mSurfaceView.getHolder();
          mSurfaceHolder.addCallback(this);
          mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL);
      }
  
      @Override
      public void surfaceChanged(SurfaceHolder holder, int format, int width,
              int height) {
          intCanvasWidth = width;
          intCanvasHeight = height;
          mDrawing = Bitmap.createBitmap(intCanvasWidth, intCanvasHeight,
                  Bitmap.Config.RGB_565);
          paint = new Paint();
      }
  
      @Override
      public void surfaceCreated(SurfaceHolder holder) {
          if (thread.getState() == Thread.State.TERMINATED) {
              thread = new Thread();
          }
          mRun = true;
          thread.start();
      }
  
      @Override
      public void surfaceDestroyed(SurfaceHolder holder) {
          boolean retry = true;
          mRun = false;
          while (retry) {
              try {
                  thread.join();
                  retry = false;
              } catch (InterruptedException e) {
                  // we will try it again and again...
              }
          }
      }
  
      Thread thread = new Thread() {
          public void doDraw(Canvas c) {
              tempCanvas.setBitmap(mDrawing);
  
              paint.setColor(Color.rgb(255, 255,255));
  
              tempCanvas.drawLine(1,1,200,300, paint);
  
              c.drawBitmap(mDrawing, 0, 0, null);
          }
  
          @Override
          public void run() {
              Canvas c;
              while (mRun) {
                  c = null;
                  try {
                      c = mSurfaceHolder.lockCanvas(null);
                      synchronized (mSurfaceHolder) {
                          doDraw(c);
                      }
                  } finally {
                      // do this in a finally so that if an exception is thrown
                      // during the above, we don't leave the Surface in an
                      // inconsistent state
                      if (c != null) {
                          mSurfaceHolder.unlockCanvasAndPost(c);
                      }
                  }
              }
          }
      };
  }
  </code></pre>