我正在尝试构建一个Android应用,每隔10分钟重复运行一次。
我发现Handlers
比定时器或调度更可靠。所以我将使用Handlers
使用下面给出的代码开发我的应用程序。
我有点担心以下代码会在每次启动应用时创建单独的Handlers
并保持它们并行运行,可能是因为我在{Handler
上创建onCreate
1}}。
那么一次只在后台运行一次Handler
运行的最佳方法是什么?
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handler = new Handler(); // new handler
handler.postDelayed(runnable, 1000*60*10); // 10 mins int.
setContentView(R.layout.activity_pro__sms);
}
private Runnable runnable = new Runnable() {
@Override
public void run() {
/* my set of codes for repeated work */
foobar();
handler.postDelayed(this, 1000*60*10); // reschedule the handler
}
};
答案 0 :(得分:5)
您可以扩展Application类并在其中完成工作。
public class App extends Application {
private Handler handler;
@Override
protected void onCreate() {
super.onCreate();
handler = new Handler(); // new handler
handler.postDelayed(runnable, 1000*60*10); // 10 mins int.
setContentView(R.layout.activity_pro__sms);
}
private Runnable runnable = new Runnable() {
@Override
public void run() {
/* my set of codes for repeated work */
foobar();
handler.postDelayed(this, 1000*60*10); // reschedule the handler
}
};
}
在清单中声明你的课程:
<application android:name=".App">
<强>被修改强>
但它仅在您的应用运行时才有效,否则您可以使用AlarmManager
。
答案 1 :(得分:4)
我决定回答我自己的问题,因为我已经找到了正确的方法。 Android的方式。首先,我试图做的并在问题中发布是对我的要求的错误方法。现在我发布这个,这样其他人就不会这样做,但方法如下。
Android几乎没有时间选择。
计时器任务 - &gt;应用程序运行时运行。最适合短期计时。资源使用率更高。
处理程序 - &gt;应用程序运行时运行。但不适合用作调度程序。 (这就是我所问的,这不是正确的方法)。 Handlers
是在应用程序被杀之前反复执行某些操作的最佳方式。
这就是我想到的。如果我错了,请纠正我。
答案 2 :(得分:0)
首先定义一个实用程序类
public abstract class HandlerPeriodRunnable implements Runnable {
private Handler periodHandler;
private int msPeriod;
public HandlerPeriodRunnable(Handler periodHandler, int msPeriod) {
this.periodHandler = periodHandler;
this.msPeriod = msPeriod;
}
@Override
public void run() {
periodRun();
if (msPeriod > 0) {
periodHandler.postDelayed(this, msPeriod);
}
}
abstract public void periodRun();
}
然后使用它
final Handler mUIHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mUIHandler.postDelayed(new HandlerPeriodRunnable(mUIHandler, 1000) {
@Override
public void periodRun() {
}
}, 2000);
}