title: Passing context to Handler
body: <p>Is it possible to pass arguments to an Android Handler?? I have two pieces of code.</p>
  
  <pre><code>new Thread(){
          public void run(){
              for(;;){
                  uiCallback.sendEmptyMessage(0);
                  Thread.sleep(2000); //sleep for 2 seconds
              }
          }
      }.start();
  
  
      private Handler uiCallback = new Handler(){
      public void handleMessage(Message msg){
          //add a new blossom to the blossom ArrayList!!
          blossomArrayList.add(new Blossom(context, R.drawable.blossom));
      }
  };
  </code></pre>
  
  <p>I of course get an error because the Handler method cannot see my context. This is probably because of this piece of code</p>
  
  <pre><code>public BoardView(Context context){
      super(context);
  </code></pre>
  
  <p>Context is not visible elsewhere, and I'm wondering if I can pass it as an argument to my Handler.</p>
  
  <p>EDIT:   I am posting the two main pieces of code to answer a question about why my Blossom object needs context. I myself am not 100% sure >.> Maybe you could have a look and see what's going on.</p>
  
  <pre><code>public class Blossom{
  private Bitmap blossom;
  private float blossomX = 0;
  private float blossomY = 0;
  private Random generator = new Random();
  
  public Blossom(Context context, int drawable)
  {
      blossom = BitmapFactory.decodeResource(context.getResources(), drawable); 
      blossomX = generator.nextInt(300);
  }
  
  public Bitmap getBitmap()
  {
      return blossom;
  }
  
  public float getBlossomX()
  {
      return blossomX;
  }
  
  public float getBlossomY()
  {
      return blossomY;
  }
  
  public void Fall(Canvas canvas, float boxY)
  {
      //draws the flower falling
      canvas.drawBitmap(blossom, blossomX,
              blossomY = blossomY+3 , null);
  
      //collision detection, currently not working after 
      //implementing random start location
  
      //if(blossomY + 29 == boxY)
      //{
          //canvas.drawBitmap(blossom,0,0,null);
      //}
  
  }
  }
  
  
  public class BoardView extends SurfaceView implements SurfaceHolder.Callback{
  Context mContext;
  
  Bitmap box = 
      (BitmapFactory.decodeResource
              (getResources(), R.drawable.box));
  
  private BoardThread thread;
  private float box_x = 140;
  private float box_y = 378;
  private float boxWidth = box.getWidth();
  private float boxHeight = box.getHeight();
  private ArrayList&lt;Blossom&gt; blossomArrayList = new ArrayList&lt;Blossom&gt;();;
  
  boolean mode = false;
  
  RectF boxRect = new RectF(box_x,box_y, box_x + boxWidth, box_y + boxHeight);
  
  public BoardView(Context context){
      super(context);
  
      //surfaceHolder provides canvas that we draw on
      getHolder().addCallback(this);
  
      // controls drawings
      thread = new BoardThread(getHolder(),this);
  
      //pass variables to instance of Blossom
      //for(int i = 0; i &lt;= 3; i++)
      //{
          //blossomArrayList.add(new Blossom(context, R.drawable.blossom));
      //}
  
      new Thread(){
          public void run(){
              for(;;){
                  uiCallback.sendEmptyMessage(0);
                  Thread.sleep(2000); //sleep for 2 seconds
              }
          }
      }.start();
  
      //intercepts touch events
      setFocusable(true);
  
  }
  
  @Override
  
  public void onDraw(Canvas canvas){
      canvas.drawColor(Color.WHITE);  
  
  
      //draw box and set start location
      canvas.drawBitmap(box, box_x - (boxWidth/2), 
              box_y - (boxHeight/2), null);
  
      for(int i = 0; i&lt;= 3; i++)
      {
          blossomArrayList.get(i).Fall(canvas, box_y);
      }
  
  }
  
  @Override
  public boolean onTouchEvent(MotionEvent event){
  
      if(event.getAction() == MotionEvent.ACTION_DOWN){
          if(boxRect.contains(event.getX(),event.getY())){
              mode = true;
          }
      }
  
      if(event.getAction() == MotionEvent.ACTION_MOVE) {
          if(boxRect.contains(event.getX(),event.getY())){
              mode = true;
          }
          if(mode == true){
              box_x = (int)event.getX();
              boxRect.set(box_x,box_y, box_x + boxWidth, box_y + boxHeight);
          }
  
      }
  
      if(event.getAction() == MotionEvent.ACTION_UP){
          mode = false;
      }
  
      invalidate();
  
      return true;
  }
  
  @Override
  public void surfaceChanged(SurfaceHolder holder, 
          int format, int width, int height ){
  
  }
  
  @Override
  public void surfaceCreated(SurfaceHolder holder){
      thread.startRunning(true);
      thread.start();
  }
  
  @Override
  public void surfaceDestroyed(SurfaceHolder holder){
      thread.startRunning(false);
      thread.stop();
  }
  
  private Handler uiCallback = new Handler(){
      public void handleMessage(Message msg){
          //add a new blossom to the blossom ArrayList!!
          blossomArrayList.add(new Blossom(context, R.drawable.blossom));
      }
  };
  
  
  }
  </code></pre>