【问题标题】:postdelayed Handler doesn't repeat the runnablepostdelayed 处理程序不重复可运行
【发布时间】:2017-03-23 13:43:48
【问题描述】:

我尝试运行此代码以从我的数据库中获取用户的状态。该过程包括 JSON,因此我创建了一个新类实现 Runnable 以充当后台服务。我确实创建了一个类扩展服务。在那个服务中,我调用了线程。我使用处理程序并使用 postDelayed 重复线程。

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

我的代码有问题吗?或者也许有替代方案可以实现我的目的。但我更喜欢有人可以帮助我修复我的代码。非常感谢

【问题讨论】:

  • 我的代码有问题吗?,是的 - postDelayed 帖子只有一次。你想达到什么目的?
  • 我需要线程反复检查用户的状态。我一直在搜索互联网,大多数网站都建议使用计时器或处理程序来实现这一点。我理解错了吗?我是安卓工作室的新手。谢谢@Blackbelt
  • postDelayed 发布一个可运行文件一次。如果您想多次发布它,您可以再次拥有可运行的 postDelayed 本身。尽管将这与线程结合起来至少可以说是一种气味-您可能不应该拥有可运行的线程,而应该只拥有一个无限循环的线程。
  • @Gabe 所以如果我再次发布延迟它,它只会运行两次?你对我有什么建议可以让 runnable 不断检查我的数据库吗?
  • 我根本不会使用 runnables。如果您想每 X 秒执行一次网络请求,请使用线程。使用通过重新发布处理程序启动的多个线程只会带来很多问题。例如,如果时间 T=0 的请求在时间 T=1 的请求之后完成怎么办?

标签: java android android-handler postdelayed


【解决方案1】:

在更好地了解其他人解释的处理程序 postDelayed 之后,我尝试寻找替代方法并尝试使用来自 Android run thread in service every X seconds 的代码 它有效。 希望我的问题能帮助像我一样迷路的其他人 这是我的新代码

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2016-06-27
    • 2016-05-01
    相关资源
    最近更新 更多