Java 后延迟处理程序不';Don’不要重复这句话

Java 后延迟处理程序不';Don’不要重复这句话,java,android,android-handler,postdelayed,Java,Android,Android Handler,Postdelayed,我尝试运行此代码以从数据库中获取用户的状态。这个过程包括JSON,所以我让一个新的类实现可以作为后台服务运行。我确实创建了一个扩展服务的类。在那个服务中,我称之为线程。我使用handler和postdayed来重复线程 public int onStartCommand(Intent intent, int flags, final int startId) { Toast.makeText(this,"SESSION START",Toast.LENGTH_SHORT).show(); ha

我尝试运行此代码以从数据库中获取用户的状态。这个过程包括JSON,所以我让一个新的类实现可以作为后台服务运行。我确实创建了一个扩展服务的类。在那个服务中,我称之为线程。我使用handler和postdayed来重复线程

public int onStartCommand(Intent intent, int flags, final int startId) {

Toast.makeText(this,"SESSION START",Toast.LENGTH_SHORT).show();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        new Thread(new BackgroundThread(startId)).start();
    }
},1000);

return START_STICKY;
}
我相信这里的代码是用来重复BackgroundThread.class实现Runnable的

public class BackgroundThread implements Runnable {
int service_id;
int mark=-1;

public BackgroundThread(int service_id) {
    this.service_id=service_id;
}

@Override
public void run() {
    JSONData jsonData = new JSONData();
    if (jsonData.getJSONstring() == 1 && mark != 1) {
        Log.e("STATUS", "" + jsonData.getJSONstring());
        mark = 1;
    } else if (jsonData.getJSONstring() == 0 && mark != 0) {
        Log.e("STATUS", "" + jsonData.getJSONstring());
        mark = 0;
    }
    Log.d("RUNNING","RUNNING");
}
}
但是线程只发生一次

11-09 23:38:56.683    6483-6526/com.example.asus.intentservice I/OpenGLRenderer﹕ Initialized EGL, version 1.4
11-09 23:38:58.743    6483-6526/com.example.asus.intentservice V/RenderScript﹕ 0xa34ed000 Launching thread(s), CPUs 4
11-09 23:38:59.642    6483-6745/com.example.asus.intentservice W/System﹕ ClassLoader referenced unknown path: /system/framework/tcmclient.jar
11-09 23:38:59.968    6483-6745/com.example.asus.intentservice E/STATUS﹕ 0
11-09 23:38:59.968    6483-6745/com.example.asus.intentservice D/RUNNING﹕ RUNNING

我的密码有问题吗?或者也许有其他方法可以达到我的目的。但我更希望有人能帮我修复代码。非常感谢

在对其他人解释的处理程序有了更好的理解之后,我尝试寻找一种替代方法,并尝试从 它是有效的。 希望我的问题能帮助像我这样的失败者 这是我的新代码

public int onStartCommand(Intent intent, int flags, final int startId) {

Toast.makeText(this,"SESSION START",Toast.LENGTH_SHORT).show();
    ScheduledExecutorService scheduleTaskExecutor = Executors.newScheduledThreadPool(5);
    scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            new Thread(new BackgroundThread(startId)).start();
        }
    },0,2, TimeUnit.SECONDS);
return START_STICKY;
}

在更好地理解了其他人解释的处理程序后,我尝试寻找一种替代方法,并尝试从 它是有效的。 希望我的问题能帮助像我这样的失败者 这是我的新代码

public int onStartCommand(Intent intent, int flags, final int startId) {

Toast.makeText(this,"SESSION START",Toast.LENGTH_SHORT).show();
    ScheduledExecutorService scheduleTaskExecutor = Executors.newScheduledThreadPool(5);
    scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            new Thread(new BackgroundThread(startId)).start();
        }
    },0,2, TimeUnit.SECONDS);
return START_STICKY;
}

我的代码有问题吗?是的-只发一次延迟的帖子。你想实现什么?我需要线程重复运行,检查用户的状态。我一直在网上搜索,大多数网站建议使用定时器或处理器来实现这一点。我理解错了吗?我是android studio的新手。感谢@BlackbeltpostDelayed发布了一次可运行的邮件。如果您想多次发布它,您可以让runnable postDelayed自身再次延迟。尽管用线程执行此操作的组合至少可以说是一种气味-您可能不应该有可运行线程,而应该有一个无限循环线程。@Gabe所以如果我再次延迟它,它只运行两次?你有什么建议让runnable经常检查我的数据库吗?我根本不会使用runnable。如果希望每X秒执行一次网络请求,请使用线程。使用通过重新发布处理程序启动的多线程只会带来很多问题。例如,如果时间T=0的请求在时间T=1的请求之后完成,该怎么办?我的代码是否有问题?是-postDelayed posts仅发布一次。你想实现什么?我需要线程重复运行,检查用户的状态。我一直在网上搜索,大多数网站建议使用定时器或处理器来实现这一点。我理解错了吗?我是android studio的新手。感谢@BlackbeltpostDelayed发布了一次可运行的邮件。如果您想多次发布它,您可以让runnable postDelayed自身再次延迟。尽管用线程执行此操作的组合至少可以说是一种气味-您可能不应该有可运行线程,而应该有一个无限循环线程。@Gabe所以如果我再次延迟它,它只运行两次?你有什么建议让runnable经常检查我的数据库吗?我根本不会使用runnable。如果希望每X秒执行一次网络请求,请使用线程。使用通过重新发布处理程序启动的多线程只会带来很多问题。例如,如果时间T=0的请求在时间T=1的请求之后完成,该怎么办?