这最近令我很困惑。我有一个线程,我开始,它一直运行,直到我杀死它 - 通过设置它的变量为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");
}
}
}
我一直在阅读使用片段来解决这个问题 - 但我无法理解如何在这种情况下使用它们。有什么简单的我不见了吗?
感谢您的帮助,
麦克
答案 0 :(得分:2)
这个想法是你允许一个片段被保留(片段没有被破坏......它会在你的方向变化中持续存在)。您的活动将被重新创建,并将重新连接到仍在运行您的线程的Fragment ..
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);
答案 1 :(得分:0)
我认为正在发生的事情是,在你的方向改变时,活动正在重新创建(就像在android中一样)。发生这种情况时,Player
对象也会重新初始化。
所以,你实际上会引用一个新的Player
对象,而旧的对象会继续在你的控制之外快乐地运行。
有很多方法可以解决这个问题。这篇博客文章将有所帮助:
http://blog.andresteingress.com/2011/09/27/fighting-orientation-changes-in-android/