1

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

}

我一直在阅读有关使用片段来解决这个问题的文章——但我只是不知道如何在这种情况下使用它们。我缺少一些简单的东西吗?

谢谢你的帮助,

麦克风

4

2 回答 2

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);

于 2013-02-13T15:14:09.597 回答
0

我认为正在发生的事情是,在您改变方向时,活动正在重新创建(就像它通常在 android 中所做的那样)。当这种情况发生时,Player对象也被重新初始化。

因此,您实际上将引用一个新Player对象,而旧对象将继续在您的控制之外愉快地运行。

有很多方法可以处理这个问题。这篇博文会有所帮助:

http://blog.andresteingress.com/2011/09/27/fighting-orientation-changes-in-android/

于 2013-02-13T15:19:54.367 回答