我正在编写我的第一个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.
我想我会这样做。
- 创建一个AsyncTask来更新UI组件。
- 创建一个线程,它将执行一个新的AsyncTask并在while循环中休眠一分钟。
- 启动步骤3中的线程。在某个时刻。
- 如果你不希望组件被更新,就中断线程。
步骤2示例
while (true) {
try {
new updateTask.execute();
Thread.sleep(60000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
Android是一个移动平台,老实说,每次你想让某些东西运行时,你最好分开考虑。您可能会耗尽电池或无缘无故地使用资源。我嫉妒Zedge app每天都在后台毫无理由地运行。特别是因为在CyanogenMod内核使WiFi休眠,而显然它目前是打开的。
我猜这更多的是一个练习,并在指定的时间间隔运行任务。一次性的,最通用的可以通过AlarmManager类完成。但这可能不是最好的解决方案。
对于一些系统范围的事件,有BroadcastReceiver类。
寻址
因此,例如,我可能希望在调用数据库之后有一个UI组件更新,并且希望它每分钟发生一次。