2013-02-13 46 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/