我必须每秒在后台运行一些代码,代码将调用webservice来搜索数据库并将值返回给应用程序。我的问题是哪种方法最有效?我已经读过Timers,Threads,AsyncTask和Services,每个人都有各自的优点和缺点。请有人告诉我,考虑到执行时间和电池寿命,哪种方式最好。
由于
更新 我决定使用Aysnc任务在后台运行我的代码,同时使用TimeTask定期触发AsyncTask。这样,当我离开特定活动时,操作就会被破坏
答案 0 :(得分:3)
您应该使用该服务进行后台操作,但在您的情况下,您希望在1秒内运行代码,这是使用它每1秒调用一次的处理程序的服务示例。
public class YourService extends Service {
private static final String TAG = "Your Service";
private final Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
}
};
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
// Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
Log.d(TAG, "onCreate");
}
@Override
public void onDestroy() {
super.onDestroy();
// Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
handler.removeCallbacks(sendUpdatesToUI);
}
private Runnable sendUpdatesToUI = new Runnable() {
public void run() {
/// Any thing you want to do put the code here like web service procees it will run in ever 1 second
handler.postDelayed(this, 1000); // 1 seconds
}
};
@Override
public void onStart(Intent intent, int startid) {
handler.removeCallbacks(sendUpdatesToUI);
handler.postDelayed(sendUpdatesToUI, 1000);//1 second
Log.d(TAG, "onStart");
}
}
并且每次android闲置服务时都不能运行服务3或4小时内我建议你使用前台服务来使用你的进程长时间运行。
答案 1 :(得分:2)
对于这样的操作,我倾向于使用服务组件。对于任务本身,我使用AsyncTask,它会在重复之前等待一段时间(使用while循环)。
答案 2 :(得分:0)
您必须创建新的Thread
,以便在呼叫时间超过预期时,呼叫不会锁定设备。 AsyncTask
是一种使用多线程的简单方法,但它缺乏重复任务的功能。我会说你最好使用Timer
或更新的ScheduledExecutorService
。
如果您选择使用Timer
,则可以创建一个TimerTask
来交付。 ScheduledExecutorService
代替了Runnable。
您可能希望将线程包装在Service
中(服务不提供新线程),但根据您的需要,这并不总是必要的。
正如评论中所建议的那样,您也可以使用Handler.postDelayed()
。虽然您仍需要创建一个新线程,然后在其上调用Looper.prepare()
:
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
(来自Looper docs的代码)
也;每秒调用一次web服务似乎过于频繁,特别是如果用户连接速度较慢或者有需要传输的数据,请尝试尽可能减少呼叫。
答案 3 :(得分:0)
我认为这不仅仅是一种解决方案,因此取决于您。您可以尝试使用此run方法启动线程:
private final int spleeptime = 1000;
public boolean running;
@Override
public void run() {
while (running) {
try {
int waited = 0;
while ((waited < spleeptime)) {
sleep(100);
waited += 100;
}
} catch (InterruptedException e) {
} finally {
// your code here
}
}
}