【发布时间】:2016-11-04 04:34:50
【问题描述】:
所以我有一个游戏活动,其中包含两个用于更新和渲染的额外线程。当我按下主页(或以任何其他方式隐藏活动)并返回时,屏幕会冻结一段时间,活动会重新启动,就像最后一个意图一样。当我长按主页(进入正在运行的应用程序列表)时,这尤其经常发生。我认为问题在于这里的线程处理。
还有 LogCat:07-01 16:52:28.793 28502-28603/com.example.game A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x7f95401a20 in tid 28603 (Thread-5887)
当然,我可以使用 onSave/RestoreInstanceState 存储故障安全数据,但仍然会发生冻结,并且该段错误看起来有点令人不安。
public class GameActivity extends AppCompatActivity {
private Thread renderThread,updateThread;
private boolean ActivityHidden=false,Pause=false,Alive=true;
private int renderSleep=25;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Constructing stuffs
renderThread = new Thread(renderRunanble);
updateThread = new Thread(updateRunnable);
}
public void render(){
if(ActivityHidden) return;
//Rendering...
}
protected void onPause(){
super.onPause();
Paused=true;
}
protected void onResume(){
super.onResume();
if(!renderThread.isAlive()) renderThread.start();
if(!updateThread.isAlive()) updateThread.start();
}
protected void onStop() {
super.onStop();
ActivityHidden=true;
renderSleep=250;
}
protected void onStart() {
super.onStart();
ActivityHidden=false;
renderSleep=25;
}
protected void onDestroy() {
super.onDestroy();
Alive=false;
try {renderThread.join();} catch(Exception e) {}
}
private Runnable renderRunnable = new Runnable() {
public void run() {
while(Alive) {
render();
try {Thread.sleep(renderSleep);} catch(Exception e){}
}
}
};
private Runnable updateRunnable = new Runnable() {
public void run() {
while(Alive) {
if(!Paused)
//updates happening
try {Thread.sleep(25);} catch(Exception e){}
}
}
};
}
@edit:注意 - 我无法在具有 API 16 或 21 的模拟器上重现它。它发生在具有 API 22 的物理设备上。
【问题讨论】:
-
在
onStop()和onDestroy()中使用Log,看看您是否可以确定发生崩溃的时间。另外,将super.onStop()和super.onDestroy()移动到各自方法的底部。 -
onStop()发生,然后是 sigsegv。onDestroy()永远不会被调用。 -
尝试像我描述的那样移动超级调用并再次运行,然后再深入研究。
-
是的,他们追求一切。
标签: android multithreading android-activity activity-lifecycle