【问题标题】:Threads on Orientation Change关于方向变化的主题
【发布时间】:2013-02-13 15:05:08
【问题描述】:

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

}

我一直在阅读有关使用片段来解决这个问题的文章 - 但我就是不知道如何在这种情况下使用它们。有什么我想念的简单的东西吗?

感谢您的帮助,

迈克

【问题讨论】:

    标签: java android multithreading orientation-changes


    【解决方案1】:

    这个想法是您允许保留片段(片段不会被破坏..它将在您的方向更改中保持不变)。您的活动将被重新创建,并将重新附加到仍在运行您的线程的 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);

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-28
        • 1970-01-01
        相关资源
        最近更新 更多