java - 方向变化的线程

标签 java android multithreading orientation-changes

这让我最近很困惑。我有一个我启动的线程,它一直运行直到我杀死它 - 通过将它的 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/

相关文章:

JavaFX、OS X、: es2, sw 的图形设备初始化失败

java - 如何获得在哈希表中使用的最佳数字?

multithreading - TThread.Synchronize 在 Delphi 2009 中导致(接近)死锁(在 Delphi 7 中工作)

c - 双缓冲设计I/O同步

java - hibernate : Class is not mapped

java - Jboss EAP 6.3 和 Spring boot 1.5.2 - logback 的部署启动问题

android - 停止 Android webview 覆盖 tabwidget

java - Realm findAllSorted by field of a filed

android - 如何在android中打开文件保存对话框?

c++ - 如何通过仅终止其父对象来退出子对象的独立线程