-5

I've having problems with my Android game. When I enter an activity it works fine, but when I leave it, and then try to reenter or push the "back" (hardware) button on the phone, the app says: "Application Not Responding".

I'm new to Android programming and I'm bad at understanding error messages, could you help me please?

EDIT

ERRORS IN LOGCAT

07-31 17:17:22.166: E/ActivityManager(344): ANR in com.coderogden.pongtennis (com.coderogden.pongtennis/.activities.StartLvlActivity)
07-31 17:17:22.166: E/ActivityManager(344): Reason: keyDispatchingTimedOut
07-31 17:17:22.166: E/ActivityManager(344): Load: 3.58 / 1.22 / 1.46
07-31 17:17:22.166: E/ActivityManager(344): CPU usage from 4577ms to -2827ms ago:
07-31 17:17:22.166: E/ActivityManager(344):   30% 344/system_server: 24% user + 6% kernel / faults: 1270 minor 55 major
07-31 17:17:22.166: E/ActivityManager(344):   7.4% 482/com.android.systemui: 6.3% user + 1% kernel / faults: 406 minor 7 major
07-31 17:17:22.166: E/ActivityManager(344):   3.4% 23661/com.google.process.location: 2.8% user + 0.6% kernel / faults: 1619 minor 52 major
07-31 17:17:22.166: E/ActivityManager(344):   1.5% 26194/com.android.vending: 0.8% user + 0.7% kernel / faults: 1555 minor 47 major
07-31 17:17:22.166: E/ActivityManager(344):   2.9% 142/surfaceflinger: 2% user + 0.9% kernel / faults: 1 minor
07-31 17:17:22.166: E/ActivityManager(344):   2.8% 25/kswapd0: 0% user + 2.8% kernel
07-31 17:17:22.166: E/ActivityManager(344):   1.8% 571/com.android.phone: 1.2% user + 0.6% kernel / faults: 411 minor 12 major
07-31 17:17:22.166: E/ActivityManager(344):   1.4% 26085/com.coderogden.pongtennis: 0.8% user + 0.6% kernel / faults: 382 minor 26 major
07-31 17:17:22.166: E/ActivityManager(344):   1.2% 25918/kworker/0:2: 0% user + 1.2% kernel
07-31 17:17:22.166: E/ActivityManager(344):   0.9% 88/mmcqd/0: 0% user + 0.9% kernel
07-31 17:17:22.166: E/ActivityManager(344):   0.8% 150/sensord: 0.1% user + 0.6% kernel
07-31 17:17:22.166: E/ActivityManager(344):   0.5% 145/mediaserver: 0.1% user + 0.4% kernel
07-31 17:17:22.166: E/ActivityManager(344):   0.5% 19146/com.google.process.gapps: 0.4% user + 0.1% kernel / faults: 291 minor 5 major
07-31 17:17:22.166: E/ActivityManager(344):   0.5% 24764/kworker/u:3: 0% user + 0.5% kernel
07-31 17:17:22.166: E/ActivityManager(344):   0.5% 24950/com.google.android.apps.plus: 0.5% user + 0% kernel / faults: 44 minor
07-31 17:17:22.166: E/ActivityManager(344):   0.5% 25950/kworker/u:2: 0% user + 0.5% kernel
07-31 17:17:22.166: E/ActivityManager(344):   0.4% 158/adbd: 0% user + 0.4% kernel
07-31 17:17:22.166: E/ActivityManager(344):   0% 588/com.lge.lgfotaclient: 0% user + 0% kernel / faults: 624 minor   

AND

07-31 17:17:19.275: I/dalvikvm(26085): threadid=3: reacting to signal 3
07-31 17:17:19.447: I/dalvikvm(26085): Wrote stack traces to '/data/anr/traces.txt'
07-31 17:17:51.564: E/Trace(26401): error opening trace file: No such file or directory (2)
07-31 17:17:51.588: V/ActivityThread(26401): Class path: /data/app  /com.coderogden.pongtennis-1.apk, JNI path: /data/data/com.coderogden.pongtennis/lib
07-31 17:17:51.752: I/dalvikvm-heap(26401): Grow heap (frag case) to 12.517MB for 700016-byte allocation
07-31 17:17:51.783: D/dalvikvm(26401): GC_CONCURRENT freed 828K, 18% free 10384K/12651K, paused 7ms+2ms, total 25ms
07-31 17:17:51.853: I/dalvikvm-heap(26401): Grow heap (frag case) to 14.213MB for 700016-byte allocation
07-31 17:17:51.908: I/dalvikvm-heap(26401): Grow heap (frag case) to 15.883MB for 700016-byte allocation
07-31 17:17:51.947: I/dalvikvm-heap(26401): Grow heap (frag case) to 18.085MB for 700016-byte allocation
07-31 17:17:52.056: D/libEGL(26401): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so
07-31 17:17:52.088: D/libEGL(26401): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so
07-31 17:17:52.088: D/libEGL(26401): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so
07-31 17:17:52.189: D/OpenGLRenderer(26401): Enabling debug mode 0

IMPORTANT JAVA CODE FOR THE ERROR

MAIN THREAD

@Override
public void run() {
    Canvas canvas;
    Log.d(TAG, "Starting game loop");

    long beginTime; // The time when the cycle begun
    long timeDiff; // The time it took for the cycle to execute
    int sleepTime; // ms to sleep (<0 if we're behind)
    int framesSkipped; // Number of frames being skipped

    sleepTime = 0;

    while (running) {
        canvas = null;

        // Try locking the canvas
        try {
            canvas = this.surfaceHolder.lockCanvas();
            if (canvas != null) {
                synchronized (surfaceHolder) {
                    beginTime = System.currentTimeMillis();
                    framesSkipped = 0; // resetting the frames skipped
                    // Update game state here!
                    this.gameView.update();
                    // Render state to the screen
                    // Draws the canvas on the panel
                    this.gameView.render(canvas);
                    // Calculate how long time the cycle took
                    timeDiff = System.currentTimeMillis() - beginTime;
                    // Calculate sleep time
                    sleepTime = (int) (FRAME_PERIOD - timeDiff);

                    if (sleepTime > 0) {
                        try {
                            // Send the thread to sleep for a short period,
                            // very useful for battery saving
                            Thread.sleep(sleepTime);
                        } catch (InterruptedException e) {
                        }
                    }

                    while (sleepTime < 0 && framesSkipped < MAX_FRAME_SKIPS) {
                        // Need to catch up by updating without rendering
                        // Update game state here!
                        this.gameView.update();

                        // Add frame period to check if in next frame
                        sleepTime += FRAME_PERIOD;
                        framesSkipped++;
                    }
                }
            }
        } finally {
            // In case of an exception the surface is not left in
            // an inconsistent state
            if (canvas != null) {
                surfaceHolder.unlockCanvasAndPost(canvas);
            }
        } // End finally
    }

SURFACEVIEW-CLASS

// //////////////////////////////////////////////////////////////////////////////////
// The render() method renders the UI graphics on the screen
public void render(Canvas canvas) {
    super.onDraw(canvas);

    if (playing) {

        // Draw components
        box.draw(canvas);

        // Draw booster/s
        if (racketTouches > 4) {
            if (b1.isUsed()) {
                b1 = new Booster();

            }
            canvas.drawBitmap(b1.booster, b1.boosterX, b1.boosterY, null);

        }
        if (racketTouches > 14) {
            if (b2.isUsed()) {
                b2 = new Booster();

            }
            canvas.drawBitmap(b2.booster, b2.boosterX, b2.boosterY, null);

        }

        if (racketTouches > 24) {
            if (b3.isUsed()) {
                b3 = new Booster();

            }
            canvas.drawBitmap(b3.booster, b3.boosterX, b3.boosterY, null);
        }           

        // Draw rackets and ball
        player.draw(canvas);
        computer.draw(canvas);
        ball.draw(canvas);

    } else {
        // Draw components
        box.draw(canvas);
        player.draw(canvas);
        computer.draw(canvas);
        ball.draw(canvas);
    }
}
Casper Lindberg
  • 1,053
  • 1
  • 11
  • 16
  • Can you try debugging with breakpoints in your lifecycle methods to see what it's doing? – Michelle Jul 31 '14 at 14:32
  • 4
    To debug your code we need to see the relevant code and a full logcat output. [This question](http://stackoverflow.com/questions/23353173/unfortunately-myapp-has-stopped-how-can-i-solve-this) will tell you about logcat and how to read it. – takendarkk Jul 31 '14 at 14:33
  • I edited my post, can you see anything now? – Casper Lindberg Jul 31 '14 at 15:27

1 Answers1

1

ANR happens when your app is doing too much on its main (UI) thread. Check your code (Activity, Service, or BroadcastReceiver) to make sure you're not doing long running or blocking operations. If your StartLvlActivity is trying to lock the surface and render to it, connect to the network, or do some other type of "expensive" operation then you need to move it off to another thread. The system gives you about 5 seconds (an eternity!) before declaring ANR, so there's obviously something long running going on in your code.

See this Android developer page for more details on processes and threads in Android.

Larry Schiefer
  • 15,687
  • 2
  • 27
  • 33