我的Android应用程序的gameLoop线程在退出时崩溃

糖果Creep

问题是,当我进入游戏并单击“主页”按钮时,gameLoop线程(我想)被弄乱了,然后弹出“不幸的是,“应用程序名称”已停止”。

我制作了一个非常简单的程序来解决此问题。该程序所做的全部工作就是在屏幕上显示一个数字,并在您触摸屏幕时增加它。当我在GameLoopThread中注释掉view.onDraw(c)时,一切似乎运行良好。

错误信息:

FATAL EXEPTION: Thread-23207
java.lang.NullPointerExeption
at com.example.crashtest.GameView.onDraw(GameView.java:61)
at com.example.crashtest.GameLoopThread.run(GameLoopThread.java:34)

这是代码:

MainActivity.java

package com.example.crashtest;

import android.os.Bundle;
import android.app.Activity;
import android.content.res.Configuration;
import android.view.KeyEvent;
import android.view.Window;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(new GameView(this));
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                return true;

            case KeyEvent.KEYCODE_MENU:
                return true;

            case KeyEvent.KEYCODE_VOLUME_UP:
                return true;

            case KeyEvent.KEYCODE_VOLUME_DOWN:
                return true;

            default:
                return false;
        }
    }
}

GameView.java

package com.example.crashtest;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class GameView extends SurfaceView { 
    private SurfaceHolder holder;
    private GameLoopThread gameLoopThread;

    private int num = 0;

    public GameView(final Context context) {
        super(context);

        holder = getHolder();
        holder.addCallback(new SurfaceHolder.Callback() {

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {

                   boolean retry = true;
                   gameLoopThread.setRunning(false);
                   while (retry) {
                          try {
                                gameLoopThread.join();
                                retry = false;
                          } catch (InterruptedException e) {}
                   }
            }

            @Override
            public void surfaceCreated(SurfaceHolder holder) {

                makeThread();
                gameLoopThread.start();
                gameLoopThread.setRunning(true);
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

            }
        });
    }

    private void makeThread() {
        gameLoopThread = new GameLoopThread(this);
    }

    @SuppressLint({ "WrongCall", "DrawAllocation" })
    @Override
    protected void onDraw(Canvas canvas) {
        // Draw black background - Write variable 'num' on the screen
        canvas.drawColor(Color.BLACK);

        Paint paint = new Paint();
        paint.setARGB(255, 0, 255, 0);
        paint.setTextSize(50);
        paint.setTextAlign(Align.CENTER);

        canvas.drawText(Integer.toString(num), getWidth() / 2, getHeight() / 2, paint);
    }

    public boolean onTouchEvent(MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_DOWN) {
            // Increase 'num' with 1 every touch
            num++;
        }

        return super.onTouchEvent(event);
    }
}

GameLoopThread.java

package com.example.crashtest;

import android.annotation.SuppressLint;
import android.graphics.Canvas;

public class GameLoopThread extends Thread {
      static final long FPS = 10;
       private GameView view;
       public boolean running = false;
       public boolean pause = false;

       public GameLoopThread(GameView view) {
             this.view = view;
       }

       public void setRunning(boolean run) {
             running = run;
       }

       @SuppressLint("WrongCall")
       @Override
       public void run() {
           long ticksPS = 1000 / FPS;
           long startTime = 0;
           long sleepTime = 0;

             while (running) {
                    Canvas c = null;
                    startTime = System.currentTimeMillis();

                    try {
                           c = view.getHolder().lockCanvas();
                           synchronized (view.getHolder()) {
                               view.onDraw(c);
                           }
                    } finally {
                           if (c != null) {
                                  view.getHolder().unlockCanvasAndPost(c);
                           }
                    }

                    sleepTime = ticksPS-(System.currentTimeMillis() - startTime);
                    try {
                           if (sleepTime > 0)
                                  sleep(sleepTime);
                           else
                                  sleep(10);
                    } catch (Exception e) {}
             }
       }
}
穆罕默德·莫恩

在关闭时查看所需的内容Activity,然后需要停止在我实现的代码中看到的线程:

GameView gameView ;
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        gameView = new GameView(this); 
        setContentView(gameView);
    }

 @Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    gameView.StopView();

}

你需要实现的方法叫StopView()GameView这样

 public void StopView() {

    if (gameLoopThread != null) {
        gameLoopThread.setRunning(false);

    }
}

之所以会出现问题,是因为您在尝试阻止线程之后仍然在线程中调用run方法,因此您需要先停止它,然后才能使用join阻止它。我使用新的实现对您的代码进行了测试,并且与我的代码配合得很好,请反馈给我

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我的线程退出时我的Android应用程序崩溃?

来自分类Dev

JavaFx应用程序在退出时崩溃

来自分类Dev

调用getWritableDatabase()时,我的Android应用程序崩溃了;方法

来自分类Dev

我启动意图时Android应用程序崩溃

来自分类Dev

当我的android应用程序崩溃时获取通知

来自分类Dev

当我调用 EditText 时,android 应用程序崩溃

来自分类Dev

当我在Android Studio中的异步线程中调用Toast.makeText时,会导致应用程序崩溃吗?

来自分类Dev

当我的 Android 应用程序的启动画面打开时,应用程序崩溃

来自分类Dev

调试:单步执行退出方法时,Android Studio导致应用程序崩溃

来自分类Dev

Android setContentView使我的应用程序崩溃

来自分类Dev

我的 android 应用程序不断崩溃

来自分类Dev

暂停时Android应用程序崩溃

来自分类Dev

暂停时Android应用程序崩溃

来自分类Dev

超过线程池9和排队的任务128时android应用程序崩溃

来自分类Dev

没有互联网连接时android线程崩溃的应用程序

来自分类Dev

我的应用程序未在崩溃的线程中列出

来自分类Dev

UI线程等待AsyncTask时应用程序崩溃

来自分类Dev

运行线程使应用程序在android中崩溃

来自分类Dev

当我使用LinearLayout.addView()时,我的Android应用程序崩溃

来自分类Dev

当我使用TabLayout时,我的Android Studio应用程序崩溃,该如何解决?

来自分类Dev

当我注册SensorManager.registerListener时,我的Android应用程序崩溃了

来自分类Dev

使用服务Android时,应用程序在关闭时崩溃,因为我试图使用意图

来自分类Dev

当我点击注销时,我的应用程序崩溃

来自分类Dev

当我更改Android Manifest中的图标时,Android应用程序崩溃

来自分类Dev

当我点击运行应用程序时,android 服务消失了,当应用程序崩溃时也是如此

来自分类Dev

当我在android中按回时为什么不退出该应用程序?

来自分类Dev

当我在android中按回时为什么不退出该应用程序?

来自分类Dev

尝试退出插件 webview 时,带有集成插件的 Cordova 应用程序在 webview 上崩溃(android 测试)

来自分类Dev

我的应用程序崩溃了

Related 相关文章

  1. 1

    为什么我的线程退出时我的Android应用程序崩溃?

  2. 2

    JavaFx应用程序在退出时崩溃

  3. 3

    调用getWritableDatabase()时,我的Android应用程序崩溃了;方法

  4. 4

    我启动意图时Android应用程序崩溃

  5. 5

    当我的android应用程序崩溃时获取通知

  6. 6

    当我调用 EditText 时,android 应用程序崩溃

  7. 7

    当我在Android Studio中的异步线程中调用Toast.makeText时,会导致应用程序崩溃吗?

  8. 8

    当我的 Android 应用程序的启动画面打开时,应用程序崩溃

  9. 9

    调试:单步执行退出方法时,Android Studio导致应用程序崩溃

  10. 10

    Android setContentView使我的应用程序崩溃

  11. 11

    我的 android 应用程序不断崩溃

  12. 12

    暂停时Android应用程序崩溃

  13. 13

    暂停时Android应用程序崩溃

  14. 14

    超过线程池9和排队的任务128时android应用程序崩溃

  15. 15

    没有互联网连接时android线程崩溃的应用程序

  16. 16

    我的应用程序未在崩溃的线程中列出

  17. 17

    UI线程等待AsyncTask时应用程序崩溃

  18. 18

    运行线程使应用程序在android中崩溃

  19. 19

    当我使用LinearLayout.addView()时,我的Android应用程序崩溃

  20. 20

    当我使用TabLayout时,我的Android Studio应用程序崩溃,该如何解决?

  21. 21

    当我注册SensorManager.registerListener时,我的Android应用程序崩溃了

  22. 22

    使用服务Android时,应用程序在关闭时崩溃,因为我试图使用意图

  23. 23

    当我点击注销时,我的应用程序崩溃

  24. 24

    当我更改Android Manifest中的图标时,Android应用程序崩溃

  25. 25

    当我点击运行应用程序时,android 服务消失了,当应用程序崩溃时也是如此

  26. 26

    当我在android中按回时为什么不退出该应用程序?

  27. 27

    当我在android中按回时为什么不退出该应用程序?

  28. 28

    尝试退出插件 webview 时,带有集成插件的 Cordova 应用程序在 webview 上崩溃(android 测试)

  29. 29

    我的应用程序崩溃了

热门标签

归档