2013-02-13 59 views
0

最近這讓我很困惑。我有一個線程,我開始,它一直運行,直到我殺了它 - 通過設置它的變量爲false。取向變化的線程

這一切工作正常,但我失去了接觸方向變化的線程,所以我無法阻止它。我寫這個,試圖澄清的問題:

public class FTTest extends Activity { 

boolean isPlaying = false; 
Player player = new Player(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_fttest); 
} 

public void play(View v) { 
    if (!isPlaying) { 
     Log.d("Play Button", "Start Pressed"); 
     player.start(); 
     isPlaying = true; 
    } else { 
     Log.d("Play Button", "Stop Pressed"); 
     player.going=false; 
     isPlaying = false; 
    } 
} 

} 

玩家就是這樣的:

public class Player extends Thread{ 
int i; 
public boolean going=true; 

public void run(){ 
    while(going){ 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     i++; 
     Log.d("Thread", "Running "+i+" times"); 
    } 
} 

} 

我一直在閱讀關於使用片段來解決這個問題 - 但我做不到讓我的頭在這方面如何使用它們。有沒有簡單的我失蹤?

感謝您的幫助,

邁克

回答

2

的想法是,你允許保留一個片段(片段不被破壞。它會在你的方向變化是持久的)。您的活動將得到重建,並會重新連接到您的片段,其仍然在運行你的線程..

public class FTTest extends Activity { 

    private FTFragment fragment; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     if (savedInstanceState == null) { 
      fragment = new FTFragment(); 
      getFragmentManager().beginTransaction().add(android.R.id.content, fragment).commit(); 
     } 
     else { 
      fragment = (FTFragment)getFragmentManager().findFragmentById(android.R.id.content); 
     } 
    } 
} 

保留片段類

public class FTFragment extends Fragment 
{ 
    boolean isPlaying = false; 
    Player player = new Player(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setRetainInstance(true); 
    } 

    public void play(View v) { 
     if (!isPlaying) { 
      Log.d("Play Button", "Start Pressed"); 
      player.start(); 
      isPlaying = true; 
     } else { 
      Log.d("Play Button", "Stop Pressed"); 
      player.going=false; 
      isPlaying = false; 
     } 
    } 

} 

在你的活動,你叫play(View)你現在應該叫fragment.play(View);

0

我認爲正在發生的事情是,在你的方向改變時,活動正在被重新創建(就像它通常在android中那樣)。發生這種情況時,Player對象也正在重新初始化。

所以,你實際上會參考一個新的Player對象,而舊的對象會繼續在你的控制之外快樂地跑步。

有很多方法可以解決這個問題。此博客文章將有幫助:

http://blog.andresteingress.com/2011/09/27/fighting-orientation-changes-in-android/