这让我最近很困惑。我有一个我启动的线程,它一直运行直到我杀死它 - 通过将它的 while 变量设置为 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");
}
}
}
我一直在阅读有关使用 fragment 来解决此问题的信息 - 但我无法理解如何在这种情况下使用它们。我缺少什么简单的东西吗?
谢谢你的帮助,
迈克
最佳答案
这个想法是您允许保留一个 fragment ( fragment 不会被破坏..它将在您的方向变化中持续存在)。您的 Activity 将被重新创建,并将重新附加到仍在运行您的线程的 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);
}
}
}
保留 fragment 类
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)
的 Activity 中,您现在应该调用 fragment.play(View);
关于java - 方向变化的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14856512/