Java 避免在更改活动时重新启动线程

Java 避免在更改活动时重新启动线程,java,android,multithreading,Java,Android,Multithreading,现在,当我改变活动时,我想睡觉或做些什么。当我回到主活动时,有两个线程在运行,做同样的事情。我不确定情况是否如此,但似乎是平等的 ... public class MainActivity extends Activity { public static double cowCount = 195; public static double income = 0.100; static boolean twiceCow = false, Threadrunning = false; ... p

现在,当我改变活动时,我想睡觉或做些什么。当我回到主活动时,有两个线程在运行,做同样的事情。我不确定情况是否如此,但似乎是平等的

...
public class MainActivity extends Activity {

public static double cowCount = 195;
public static double income = 0.100;
static boolean twiceCow = false, Threadrunning = false;
...
public void inc() {
    new Thread(new income()).start();
}

class income implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 20;) {
            final int value = i;
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            handler.post(new Runnable() {

                @Override
                public void run() {
                    cowCount = cowCount + income;
                    refresh();
                }
            });
        }
    }
}
我真的不明白我做错了什么。

请查看此帖子:

将您的活动重新启动视为与配置更改相同的事情

这种模式,即使用保留的片段作为线程的容器,并通过对活动的回调代理UI更新,对您来说是一种更好的模式


在您的情况下,UI refresh()只需要一个TaskCallback,例如onRefreshCowCount(int cows)

您不是在代码的某个地方设置了
Threadrunning=false
吗?是的,在主类的开头。但是在声明或onCreate上还是什么?从你的代码中,我也看不出哪里做错了。您可以登录
inc()
,查看何时调用它。抱歉,不清楚。我做了一个编辑,我希望它能让事情更清楚。你需要显示足够的代码,这样我们才能知道发生了什么。您显示的代码从未调用checkThread(),我正在阅读它。这看起来很有希望,但我有一个问题,我想你可以回答:我应该在主类中还是在单独的类中创建片段?就像文章一样,在你的主活动中实例化片段。主要区别在于“DummyTask”将是您的线程,而不是异步任务。线程将是片段的私有内部类。片段通过onAttach/onDetach“知道”活动。
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    handler = new Handler();
    checkThread();
}

private void checkThread() {
    if (Threadrunning == false)
    inc();
    Threadrunning = true;
}
public void inc() {
    new Thread(new income()).start();
}
...
public void refresh () {
TextView myTextView = (TextView)findViewById(R.id.myText);
myTextView.setText("You Have " + String.valueOf((nf.format(cowCount)) + " Cows!"));
}