在Android中每隔1秒在后台运行我的代码

时间:2012-06-11 08:44:43

标签: android multithreading service android-asynctask timertask

我必须每秒在后台运行一些代码,代码将调用webservice来搜索数据库并将值返回给应用程序。我的问题是哪种方法最有效?我已经读过Timers,Threads,AsyncTask和Services,每个人都有各自的优点和缺点。请有人告诉我,考虑到执行时间和电池寿命,哪种方式最好。

由于

更新 我决定使用Aysnc任务在后台运行我的代码,同时使用TimeTask定期触发AsyncTask。这样,当我离开特定活动时,操作就会被破坏

4 个答案:

答案 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
        }
    }
}