【问题标题】:Android Application Not RespondingAndroid 应用程序无响应
【发布时间】:2014-07-31 14:27:54
【问题描述】:

我的 Android 游戏出现问题。当我进入一个活动时,它工作正常,但是当我离开它,然后尝试重新进入或按下手机上的“返回”(硬件)按钮时,应用程序显示:“应用程序无响应”。

我是 Android 编程新手,我不擅长理解错误消息,请您帮帮我吗?

编辑

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   

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

错误的重要 JAVA 代码

主线程

@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-类

// //////////////////////////////////////////////////////////////////////////////////
// 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);
    }
}

【问题讨论】:

  • 您可以尝试在生命周期方法中使用断点进行调试,看看它在做什么吗?
  • 要调试您的代码,我们需要查看相关代码和完整的 logcat 输出。 This question 会告诉你关于 logcat 以及如何阅读它。
  • 我编辑了我的帖子,你现在能看到什么吗?

标签: java android


【解决方案1】:

当您的应用在其主 (UI) 线程上执行过多操作时,就会发生 ANR。检查您的代码(ActivityServiceBroadcastReceiver)以确保您没有进行长时间运行或阻塞操作。如果您的StartLvlActivity 试图锁定表面并对其进行渲染、连接到网络或执行一些其他类型的“昂贵”操作,那么您需要将其移至另一个线程。在声明 ANR 之前,系统会为您提供大约 5 秒(永恒!),因此您的代码中显然有一些长时间运行。

有关 Android 中进程和线程的更多详细信息,请参阅此 Android developer page

【讨论】:

    猜你喜欢
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-09
    • 2015-12-10
    • 2014-01-31
    • 1970-01-01
    相关资源
    最近更新 更多