Drawing a background make my app slow
<p>I am trying to make a very simple game. The user has to try to catch an apple using a basket moved by his finger.
Everything seems to work pretty well, but I have a problem: I want to draw a background for the app. But using an image as backgorund makes the app extremely slow and causes a lot of lag. If I use White Background I have no problems.</p>

<p>Can somebody tell me what I am doing wrong?</p>

<p>I think it is because I draw the background everytime the app updates, but I don't know any way to change this.</p>

<p>Maybe my code is a bit confusional, I am still learning.</p>

<p>Thanks for the help!</p>

<pre><code>package com.cris9696.mela;

import java.util.Random;

import com.cris9696.mela.R;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.graphics.Paint.Align;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnTouchListener;

public class Game extends Activity implements OnTouchListener {

ClasseCanvas View;
float xApple, yApple, xBasket, yBasket;
Bitmap Apple, Basket, BackG;
Random rnd = new Random();
int win = 0, score = 0, level = 1;
int record = 0;
Typeface Font;
Paint TextP = new Paint();
Rect dest;
Paint paint;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Font = Typeface.createFromAsset(getAssets(), "TF2.ttf");
    View = new ClasseCanvas(this);
    View.setOnTouchListener(this);
    TextP.setColor(Color.RED);
    TextP.setTextSize(50);
    TextP.setTypeface(Font);
    xApple = yApple = xBasket = yBasket = 0;
    xApple = rnd.nextInt(600);
    Apple = BitmapFactory.decodeResource(getResources(), R.drawable.apple);
    BackG = BitmapFactory
            .decodeResource(getResources(), R.drawable.bg);
    Basket = BitmapFactory.decodeResource(getResources(),
            R.drawable.basket);

    setContentView(View);

}

// /////////////////////////////////////////////////////////////////////////////

@Override
public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub

    xBasket = event.getX();
    yBasket = event.getY();
    /*
     * switch (event.getAction()) { // ci dice cosa succede
     * 
     * case MotionEvent.ACTION_DOWN:
     * 
     * case MotionEvent.ACTION_UP:
     * 
     * break; }
     */
    return true;
}

// ///////////////////////////////////////////////////////////////////////////

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    View.pause();
}

// /////////////////////////////////////////////////////////////////////////////

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    View.resume();
}

// ///////////////////////////////////////////////////////////

public class ClasseCanvas extends SurfaceView implements Runnable {

    SurfaceHolder Holder;
    Thread thread = null;
    boolean isRunning = true;

    public ClasseCanvas(Context context) {
        super(context);
        Holder = getHolder();

        // TODO Auto-generated constructor stub
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        while (isRunning) {
            if (!Holder.getSurface().isValid())
                continue;

            Canvas canvas = Holder.lockCanvas();

            dest = new Rect(0, 0, getWidth(), getHeight());
            paint = new Paint();
            paint.setFilterBitmap(true);
            canvas.drawBitmap(BackG, null, dest, paint);
            TextP.setColor(Color.RED);
            canvas.drawText(Integer.toString(score), 56, 56, TextP);
            TextP.setColor(Color.BLACK);
            canvas.drawText("Level " + Integer.toString(level), 115,
                    56, TextP);
            if (xBasket != 0 &amp;&amp; yBasket != 0) {
                canvas.drawBitmap(Basket, xBasket - Basket.getWidth() / 2,
                        yBasket - Basket.getHeight() / 2, null);
            }
            canvas.drawBitmap(Apple, xApple, yApple, null);
            if (yApple &lt; canvas.getHeight())
                if (score &gt;= 0)
                    yApple += 5 * level;
                else
                    yApple += 5;
            else {
                yApple = 0;
                score--;
                xApple = rnd.nextInt(canvas.getWidth() - Apple.getWidth());
            }
            if (score &gt; record)
                record = score;
            if (score == 10) {
                level++;
                score = 0;
            }
            if ((xApple &gt;= xBasket - (Basket.getWidth() / 2)
                    &amp;&amp; xApple + (Apple.getWidth()) &lt;= xBasket
                            + (Basket.getWidth() / 2) &amp;&amp; yApple &gt;= yBasket &amp;&amp; yApple &lt;= yBasket
                    + Basket.getHeight())
                    || (xApple &gt;= xBasket - (Basket.getWidth() / 2)
                            &amp;&amp; xApple &lt;= xBasket + (Basket.getWidth() / 2)
                            &amp;&amp; yApple &gt;= yBasket &amp;&amp; yApple &lt;= yBasket
                            + Basket.getHeight())
                    || (xApple + (Apple.getWidth()) &gt;= xBasket
                            - (Basket.getWidth() / 2)
                            &amp;&amp; xApple + (Apple.getWidth()) &lt;= xBasket
                                    + (Basket.getWidth() / 2)
                            &amp;&amp; yApple &gt;= yBasket &amp;&amp; yApple &lt;= yBasket
                            + Basket.getHeight())) {
                win = 1;
                xApple = rnd.nextInt(canvas.getWidth());
                yApple = 0;
                score++;
            }

            Holder.unlockCanvasAndPost(canvas);
        }
    }

    public void pause() {
        isRunning = false;
        while (true) {
            try {
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            break;
        }
        thread = null;
        // TODO Auto-generated method stub
    }

    public void resume() {
        // TODO Auto-generated method stub
        isRunning = true;
        thread = new Thread(this);
        thread.start();
    }

}
}
</code></pre>
