报错信息:

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. PackageManagerService的启动过程分析
  2. android应用去掉title bar 及全屏处理方法
  3. Android(安卓)网络多线程断点下载
  4. android技术开发例子,解析以及源码集锦
  5. android技术开发例子,解析以及源码集锦
  6. android 图片压缩的方法
  7. 解析Android消息处理机制:Handler/Thread/Looper & MessageQueue
  8. Android(安卓)直接打开log的一种方法
  9. Android的快速开发框架 afinal

随机推荐

  1. Android(安卓)创建AlertDislog时要小心哦
  2. listview的item中含有checkbox的一些问题
  3. arcgis for android访问arcgis server上
  4. android aidl 传递parcelable
  5. ActionBar的简单使用(修改背景颜色,文字居
  6. 手机cpu厂商和手机cpu架构
  7. Android(安卓)SDK API 13升级指南
  8. Android视频播放框架一、Vitamio
  9. NDK学习笔记(十四) 使用AVILib+window创
  10. android 用editview 禁用输入法,涉及到的