发送心跳gcm



我使用GCM开发android应用程序,我想每5分钟发送一次心跳,我在服务运行时创建它,这些是我的代码,

public class sendHeartbeat extends Service{
    private Handler customHandler = new Handler();
    private static final String TAG = "MyService";
    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
    @Override
    public void onCreate() {
        Log.d(TAG, "onCreate");
    }
    @Override
    public void onStart(Intent intent, int startId) {
        Log.d(TAG, "onStart");  
        customHandler.postDelayed(updateTimerThread, 0);
    }
    @Override
    public void onDestroy() {
        Log.d(TAG, "onDestroy");
    }
    private Runnable updateTimerThread = new Runnable() {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            new syncGetHeartbeat().execute();
            Log.d("send hearbeat","send hearrrrrrrbeat");
            customHandler.postDelayed(this, 260000);
        }
    };

    class syncGetHeartbeat extends AsyncTask<Void, Void, String> { 
       @Override
        protected String doInBackground(Void... unsued) {
            try {                       
                String varId="naengoland";
                String url = "http://mydomain.com/gcmserver/getHeartbeat.php?id="+varId; 
                getRequestJSON(url);
                return null;
            } catch (Exception e) {
                Log.e(e.getClass().getName(), "service get hertbeat "+ e.toString());
                return null;
            }
        }
        @Override
        protected void onProgressUpdate(Void... unsued) {
        }
        @Override
        protected void onPostExecute(String sResponse) {
        }
    }
    public String getRequestJSON(String Url){
        HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet(Url);
        try{
          client.execute(request);
        }catch(Exception ex){
        }
        return null;
    }
}

我每5分钟成功发送一次心跳,但问题是我的应用程序运行缓慢,消耗电池很多,除了我的方式外,还有什么方法可以发送心跳吗?我是说,比我的方法更好的方法。

请帮。

使用TimerTask提供比使用Thread (ref)更好的性能。然而,TimerTask在同时处理多个线程时并不好,这在您的情况下不是一个问题,因为您正在重复执行一个任务。

下面是Timer的代码:

首先初始化Timer:

private Timer timer;

in onCreate:

timer = new Timer();

then within onStart:

timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            new syncGetHeartbeat().execute();
            Log.d("send hearbeat","send hearrrrrrrbeat");
        }
    }, 0, 300000); //means start at 0 second and each 5 mins (300000 ms) run the task

我不确定是否有其他的解决方案,有更好的性能,但这绝对比运行线程在一个固定的速率。

最新更新