以设定的间隔在单独的进程上触发Android Activity方法



我正在编写我的第一个Android应用程序(到目前为止很有趣!),但遇到了一个障碍。我正在使用针对Android 4.2的SDK工具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);
        }
    }
}

我将像这样使用它(在Activity中)

      ScheduledThreadPoolExecutor threadPool = new ScheduledThreadPoolExecutor(1);
      BaseEvent callback = new BaseEvent() {
            public void onFire(Object... params){
                if(params[0] !=null)
                {
                    Context context = (Context)params[0];
                    Toast toast = Toast.makeText(context, "Task ran", Toast.LENGTH_SHORT);
                    toast.show();
                }
            }
      };
      threadPool.scheduleAtFixedRate(new HeartBeatTask(callback,(this)),0, 5, TimeUnit.SECONDS);

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

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

谁能告诉我我是否在正确的轨道上吗?我所做的是实现目标的可行方法吗?有更好的办法吗?任何意见或建议将非常感激。谢谢!

给Android初学者的一些建议。

  • 不要叫它separate process。进程是一个不同的东西(谷歌'Linux进程'),你想在同一个进程内的一个单独的线程上调用它们。

  • ScheduledThreadPoolExecutor 比任何其他人会建议你在这里,如定时器或PostDelayed更好。

但我认为你确实有一个哲学上的错误,因为UI更新不应该以定时的方式运行,而是以事件为基础。一旦你的数据库,磁盘或网络操作从后台线程完成,你回调UI线程立即更新它。

有几个工具,我将列出几个,指出我最喜欢的一个,但让你对每个工具做一些研究

  • Handler:这是基本的java方式
  • AsyncTask:很好的框架,但不处理屏幕旋转
  • Loader:这是我的首选方式

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

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.

我想我会这样做。

  1. 创建一个AsyncTask来更新UI组件。
  2. 创建一个线程,它将执行一个新的AsyncTask并在while循环中休眠一分钟。
  3. 启动步骤3中的线程。在某个时刻。
  4. 如果你不希望组件被更新,就中断线程。

步骤2示例

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

Android是一个移动平台,老实说,每次你想让某些东西运行时,你最好分开考虑。您可能会耗尽电池或无缘无故地使用资源。我嫉妒Zedge app每天都在后台毫无理由地运行。特别是因为在CyanogenMod内核使WiFi休眠,而显然它目前是打开的。

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

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

寻址

因此,例如,我可能希望在调用数据库之后有一个UI组件更新,并且希望它每分钟发生一次。

最新更新