Java 方向改变时的螺纹
最近我真的很困惑。我有一个线程,我启动它,它一直运行,直到我杀死它-通过设置它的while变量为false 这一切工作正常,但我失去了方向变化的线程接触,所以我不能阻止它。我写这篇文章是为了试图澄清这个问题:Java 方向改变时的螺纹,java,android,multithreading,orientation-changes,Java,Android,Multithreading,Orientation Changes,最近我真的很困惑。我有一个线程,我启动它,它一直运行,直到我杀死它-通过设置它的while变量为false 这一切工作正常,但我失去了方向变化的线程接触,所以我不能阻止它。我写这篇文章是为了试图澄清这个问题: public class FTTest extends Activity { boolean isPlaying = false; Player player = new Player(); @Override protected void onCreate(Bundle savedI
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");
}
}
}
我一直在读关于使用片段来解决这个问题的书,但我就是不知道如何在这种情况下使用它们。有什么简单的东西我遗漏了吗
谢谢你的帮助
Mike这个想法是允许保留一个片段(片段不会被销毁..它将在整个方向更改中保持)。您的活动将被重新创建,并将重新连接到仍在运行线程的片段
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)代码>我认为现在发生的是,当你改变方向时,活动正在被重新创建(就像android中通常做的那样)。发生这种情况时,Player
对象也将被重新初始化
因此,您实际上将有一个对新的Player
对象的引用,而旧的对象将继续在您的控制之外快乐地运行
有很多方法可以解决这个问题。这篇博文将对您有所帮助: