[英]Android activity with threads get destroyed after onStop()
所以我有一個游戲活動,它有兩個額外的線程用於更新和渲染。 當我按下主頁(或以任何其他方式隱藏活動)並返回時,屏幕會凍結一段時間,並且活動會像最后一個意圖一樣重新啟動。 當我長按回家(進入正在運行的應用列表)時,這種情況經常發生。 我假設問題出在這里的線程處理。
另外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存儲故障安全數據,但仍然會發生凍結,並且segfault看起來有點令人不安。
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的物理設備上。
我不確定100%如果我剛剛找到解決方案但是在應用了這個並嘗試了很多應用程序崩潰后,我沒有遇到段錯誤。 在onStop()
我中斷線程, 加入渲染線程並使它們無效。 onStart()
我基於runnables創建新線程。
protected void onStop() {
ActivityHidden=true;
Alive=false;
renderSleep=250;
updateThread.interrupt();
renderThread.interrupt(); //Sometimes don't happen because it's still rendering
try {renderThread.join();} catch(Exception e){}
updateThread=null;
renderThread=null;
super.onStop();
}
protected void onStart() {
super.onStart();
ActivityHidden=false;
Alive=true;
renderSleep=25;
if(updateThread==null) {updateThread = new Thread(updateRunnable); updateThread.start();}
if(renderThread==null) {renderThread = new Thread(renderRunnable); renderThread.start();}
}
當然,如果應用程序在onStop
和onStart
之間切換非常快,那么方法可能會失敗,但實際上這不應該發生。 而且仍然不能保證不會有重復。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.