Java 以设置的间隔在单独的进程上启动Android活动方法

Java 以设置的间隔在单独的进程上启动Android活动方法,java,android,mobile,Java,Android,Mobile,我正在写我的第一个安卓应用程序(到目前为止乐趣无穷!),但遇到了障碍。我使用的是针对Android 4.2的SDK tools 21.1 我正在尝试设置一个系统,允许活动注册以在设置的时间间隔调用方法。我希望这样做,请求的处理将在它自己的进程中处理,以避免使UI无响应 我一直在读一些书,并探索了一些途径。首先,我认为一个服务将是一个很好的方式去做这件事,但发现相当多的信息表明,这不是一个好的做法,因为操作系统能够不加区别地杀死服务 我现在正在研究如何使用ScheduledThreadPoolEx

我正在写我的第一个安卓应用程序(到目前为止乐趣无穷!),但遇到了障碍。我使用的是针对Android 4.2的SDK tools 21.1

我正在尝试设置一个系统,允许活动注册以在设置的时间间隔调用方法。我希望这样做,请求的处理将在它自己的进程中处理,以避免使UI无响应

我一直在读一些书,并探索了一些途径。首先,我认为一个服务将是一个很好的方式去做这件事,但发现相当多的信息表明,这不是一个好的做法,因为操作系统能够不加区别地杀死服务

我现在正在研究如何使用ScheduledThreadPoolExecutor。我用一个可重写的方法创建了这个简单的类来传递方法:

public abstract class BaseEvent implements EventListener {

    public abstract void onFire(Object... params);
} 
我已创建此可运行任务,并调用该方法:

public class HeartBeatTask implements Runnable {


    private BaseEvent mCallback;

    private Object mParams;

    public HeartBeatTask(BaseAioEvent callback,Object... params){
        mParams = params;

        mCallback = callback;
    }

    @Override
    public void run() {
        Log.d(LOG_TAG,"Run called");
        if(mCallback != null)
        {
            mCallback.onEvent(mParams);
        }

    }
}
我将这样使用它(在活动中)

这将每5秒执行一次任务,尽管回调方法只运行一次

我想这可能不是一个好的做事方式。我觉得我把事情复杂化了。我真正需要的是能够在除主线程之外的进程上以设置的间隔执行方法,活动可以将多个操作绑定到该方法。因此,例如,我可能希望在调用数据库后更新UI组件,并且希望每分钟都更新一次


有人能告诉我我在这条路上走对了吗?我想做的事是实现我目标的可行方法吗?我可以采取更好的方法吗?如有任何意见或建议,将不胜感激。谢谢

给Android初学者的一些建议

  • 不要称之为
    单独的过程
    。(Google'Linux进程'),您希望在同一进程内的单独线程上调用它们

  • ScheduledThreadPoolExecutor
    比这里人们建议您使用的任何其他工具(如计时器或PostDelayed)都要好

但我认为您在这里确实存在一个哲学错误,即UI更新不应该以定时方式运行,而应该以事件为基础。数据库、磁盘或网络操作从后台线程完成后,您将回调到UI线程以立即更新它

这方面有几种工具,我会列出一些,指出我最喜欢的一种,但让你对每一种都做一些研究

  • :这是基本的java方式
  • :框架不错,但不处理屏幕旋转
  • 这是我喜欢的方式

  • Android是一个移动平台,诚实地说,每次你想运行某个东西,你最好单独考虑。您可能会无缘无故地耗尽电池或使用资源。我讨厌Zedge应用程序每天都在后台无缘无故地运行。尤其是在CyanogenMod上,内核让WiFi进入睡眠状态,而显然它目前处于开启状态

    我猜这更像是一个练习,是为了在指定的时间间隔内运行任务。一次性的,最通用的可以通过AlarmManager类完成。但这可能不是最好的解决方案

    对于某些系统范围的事件,有BroadcastReceiver类

    寻址时

    因此,例如,我可能希望在调用数据库后更新UI组件,并且希望每分钟都更新一次


    通过界面真的更容易。

    我觉得你的方法有点复杂。考虑一下你的例子

    So, for instance, I may want to have a UI component update after a call is made
    to a database, and would want that to happen every minute.
    
    我想我会这样做的

  • 创建一个将更新UI组件的异步任务
  • 创建一个线程,该线程将执行一个新的异步任务,并在while循环中休眠一分钟
  • 在步骤3中启动线程。在某个时刻
  • 如果不想更新组件,请中断线程
  • 步骤2的示例

    while (true) {
        try {
            new updateTask.execute();
            Thread.sleep(60000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
    
    while (true) {
        try {
            new updateTask.execute();
            Thread.sleep(60000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }