Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在我的示例中,为什么线程的行为是这样的?_Java_Android_Handler - Fatal编程技术网

Java 在我的示例中,为什么线程的行为是这样的?

Java 在我的示例中,为什么线程的行为是这样的?,java,android,handler,Java,Android,Handler,有人能给我解释一下关于线程代码的两件事吗?我最终几乎按照它应该的方式工作。我想每x秒在后台做一个周期性的任务,并且能够随意停止和启动它。我根据我找到的示例编写了代码,但我不确定是否以正确的方式编写。为了进行调试,任务将使用custom showTime()显示时间 现在的问题是: 1) 如果我用停止按钮停止,我的线程会永远退出吗 2) 为什么我不能用“开始”按钮再次启动它?如果我在按钮中添加tread.start(),它会崩溃吗 3) 我尝试了第二个版本,当时我让线程运行并将一个条件放入处理程序

有人能给我解释一下关于线程代码的两件事吗?我最终几乎按照它应该的方式工作。我想每x秒在后台做一个周期性的任务,并且能够随意停止和启动它。我根据我找到的示例编写了代码,但我不确定是否以正确的方式编写。为了进行调试,任务将使用custom showTime()显示时间

现在的问题是:
1) 如果我用停止按钮停止,我的线程会永远退出吗

2) 为什么我不能用“开始”按钮再次启动它?如果我在按钮中添加tread.start(),它会崩溃吗

3) 我尝试了第二个版本,当时我让线程运行并将一个条件放入处理程序。使其工作的唯一方法是通过添加

if (thread1_running) {
                handler.postDelayed(this, 2000);
                showTime(Napis2);
            }
将线程中的条件更改为 while (true) 正确的方法是启动和停止整个线程吗?或者这是最好的方法?

线程a由java中的a描述

当线程退出其run方法时,它将进入stopped状态,无法重新启动

您应该始终通过退出线程的run方法来停止线程,因为这样做是正确的

如果要“重新启动线程”,请启动thread类的新实例

您应该更好地封装线程及其运行字段。它应该在thread类中,该类应该提供一个公共方法来切换布尔值。没有人关心您的数据结构,请隐藏它们。:)


你应该考虑使用RunOniType作为可运行的,它比处理程序更容易使用。

< P>最好的方法是,以我的拙见,对<代码>后延迟(可运行,长)< /> >

你可以这样做。类别定义:

private Handler mMessageHandler = new Handler();

private Runnable mUpdaterRunnable = new Runnable() {
        public void run() {
            doStuff();
            showTime(Napis2);
            mMessageHandler.postDelayed(mUpdaterRunnable, 1000);
        }
};
并按如下方式控制真正的运行/停止:

开始:

mMessageHandler.postDelayed(mUpdaterRunnable, 1000);
并停止:

mMessageHandler.removeCallbacks(mUpdaterRunnable);

在我看来,这要简单得多。

我想我需要一个单独的步骤,因为我需要在mUpdaterRunnable中加入一个通过网络向服务器发起的呼叫,这个呼叫可能非常慢(最多1秒),并且不想让我的应用程序变得缓慢。。。。。。我刚刚测试了代码(没有线程),它在第一个mMessageHandler.postDelayed(mUpdaterRunnable,1000)上崩溃;我在我的应用程序onCreate()中所做的。更新您的问题(在末尾追加)您的当前代码(请仅为最小值)和日志cat错误行。我不清楚目前的情况。自从第一次问到我的问题,我希望这个问题能更好地描述它
mMessageHandler.postDelayed(mUpdaterRunnable, 1000);
mMessageHandler.removeCallbacks(mUpdaterRunnable);