报错信息:

FATAL EXCEPTION: main
                                                                          Process: com.example.lxx.game_lxx, PID: 31256
                                                                          java.lang.IllegalThreadStateException: Thread already started
                                                                              at java.lang.Thread.checkNotStarted(Thread.java:849)
                                                                              at java.lang.Thread.start(Thread.java:1059)
                                                                              at com.example.lxx.game_lxx.lxx01_GameView.surfaceCreated(lxx01_GameView.java:114)

问题产生:

在使用SurfaceView绘制游戏的过程中,创建了一个Thread,且在Thread中已经使用 了boolean值控制run函数中的循环,在SurfaceCreate方法中调用线程的thread.start()方法。在退出后,理论上因为退出时将标志位设为了false,Thread中run方法执行结束,应当自动销毁,但重新打开该活动时产生一个thread already exist错误。


分析原因:

thread是在活动创建时产生的,在整个活动持续过程中,除非该活动被finish(),否则该变量一直存在,即便线程执行结束被回收。追踪start()方法,可以看到如下代码

public synchronized void start() {        if(this.threadStatus != 0) {            throw new IllegalThreadStateException();        } 
发现异常正是从一条语句中抛出。接下来查找threadStatus变量,在整个文件中并没有找到有threadStatus改变的语句。如有人知道问题产生原因还请指导一下。


解决方法:将thread.start()替换为 new Thread(thread).start();这里需要检测一下之前使用标识位停止的线程是否被正常回收,使用Android studio-》tools-》Android device monitor  运行后看到的线程数和退出重新进入看到的线程数是相同的。证明之前的线程已经被正常回收,这样一来这个问题就得到解决。

更多相关文章

  1. android的进程与线程
  2. Android 禁止转屏的方法
  3. android应用去掉title bar 及全屏处理方法
  4. Android 网络多线程断点下载
  5. android 图片压缩的方法
  6. Android 直接打开log的一种方法
  7. Android在设置里面添加新功能的方法
  8. android studio最新sdk更新方法

随机推荐

  1. 详解Centos7 修改mysql指定用户的密码
  2. MySQL5.7安装过程并重置root密码的方法(sh
  3. 微信昵称带符号导致插入MySQL数据库时出
  4. Mysql 忘记root密码和修改root密码的解决
  5. mysql 5.7.12 winx64手动安装教程
  6. SQL分页查询存储过程代码分享
  7. MySQL5.7 group by新特性报错1055的解决
  8. CentOs7.x安装Mysql的详细教程
  9. Mac下忘记mysql密码重新设置密码的图文教
  10. mysql limit 分页的用法及注意要点