问题是当我进入游戏并单击“主页”按钮时,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) {}

}

}

}

java检测安卓程序退出_java-我的Android应用程序的gameLoop线程在退出...相关推荐

  1. Android程序 地图,在定制的Android应用程序中使用谷歌地图

    我收到以下问题(显示在LogCat中).我希望any1可以帮助我,因为我是android应用程序开发的新手.在定制的Android应用程序中使用谷歌地图 11-17 16:50:38.087: E/A ...

  2. android重新加载程序,从被杀死的Android应用程序中恢复

    发生了什么: >我打开我的应用程序,然后按主页按钮离开它片刻. >我进入设置>应用程序>管理应用程序>运行,在缓存的后台应用程序列表中找到我的应用程序,然后停止它. &g ...

  3. 允许网页打开android应用程序,通过浏览器直接打开Android应用程序

    需求 通过手机浏览器直接打开Android应用程序.假设本地已经安装了指定Android应用,就直接打开它:假设没有安装,则直接下载该应用的安装文件(也能够跳转到下载页面). 实现效果 假设手机上已经 ...

  4. Android程序的几个组成部分,Android应用程序开发的四个重要组成部分

    51CTO为大家介绍过<Android SNK初探>,Android开发必须要了解构造块,Android应用程序是由四个重要组成部分组成的,这四种构造块如下: ◆Activity ◆Int ...

  5. java检测安卓程序退出_java – 退出应用程序时的Android停止服务

    我正在创建一个带有背景音乐的游戏应用程序.我使用Android服务进行游戏 背景音乐,因为我想在改变活动时运行BGM. 我的问题是,我在每个活动中的onPause方法中声明了finish()(我不想让 ...

  6. java检测安卓程序退出_Android:应用程序退出后出现奇怪的NameNotFoundException

    安装ADT r22之后,每次关闭应用程序时,我都会在LogCat中收到此异常: E/LuckyLauncherView(227): in setViewEveryArea() E/LuckyLaunc ...

  7. java 不退出_Java项目不挂断运行,即当账户退出或终端关闭时,程序仍然运行,并附上执行脚本...

    把打包好的jar包上传服务器以后,直接运行java -jar+文件名 命令即可以完成启动. 若需要在公网上如何不挂断开启程序,可以使用nohup java -jar +文件名 &命令,其中no ...

  8. java编写类骑士游历_java课程设计骑士游历程序的开发

    java课程设计骑士游历程序的开发 JAVA程序设计 课程设计报告 课 题: 骑士游历程序的开发 姓 名: 学 号: 同组姓名: 专业班级: 指导教师: 设计时间: 2013.06.10 评阅意见: ...

  9. java程序安装_java实现可安装的exe程序

    java实现可安装的exe程序 通过编写Java代码,实现可安装的exe文件的一般思路: 1.在eclipse中创建java项目,然后编写Java代码,将编写好的Java项目导出一个.jar格式的ja ...

最新文章

  1. 使用Gradle第一次构建Web应用
  2. model1模式变为mv模式,实现业务逻辑和画面的分离
  3. MyBatis架构设计及源代码分析系列(一):MyBatis架构
  4. gif android. 耗资源,Android MP4转GIF
  5. 关于.net core http error 502.5 - process failure
  6. 教你如何使用 OpenCV检测图像中的轮廓
  7. 720环物全景制作_什么是全景?关于360°全景和720°全景的区别你知道吗?
  8. python设计模式(十四):模板方法模式
  9. python concat_python中merge、concat用法
  10. shiro学习(19): 拦截器
  11. python中列表如何比较大小_如何比较python中的列表/列表?
  12. jq之slidedown()
  13. ueditor 在线附件和在线图片路径错误BUG补丁
  14. JS 和 Java 中URL特殊字符编码方式
  15. Virident:PCIe SSD更能发挥闪存的特长
  16. Unix/Linux操作系统介绍
  17. 用C 程序理解汉字的机内码表示
  18. IDEAIU-version2019.2百度网盘下载
  19. 【服务器管理】服务器主机插内存条技巧
  20. 二维码的生成细节和原理源码

热门文章

  1. CF1082E Increasing Frequency
  2. Vue组件的生命周期
  3. Output Operations on DStreams
  4. C#中方法的参数四种类型(值参数、ref、out、params)详解
  5. SqlAlchemy个人学习笔记完整汇总
  6. 微软Http错误Code解析
  7. Latent dirichlet allocation note -- Prepare
  8. VMWare中CentOS系统不能上网的解决
  9. Linux ls 命令详解
  10. 一些 Windows 命令行学习