Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 发送心跳gcm?_Android_Google Cloud Messaging_Heartbeat - Fatal编程技术网

Android 发送心跳gcm?

Android 发送心跳gcm?,android,google-cloud-messaging,heartbeat,Android,Google Cloud Messaging,Heartbeat,我使用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

我使用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;
    }
}
公共类sendHeartbeat扩展服务{
私有处理程序customHandler=新处理程序();
私有静态最终字符串TAG=“MyService”;
@凌驾
公共IBinder onBind(意图arg0){
返回null;
}
@凌驾
public void onCreate(){
Log.d(标记为“onCreate”);
}
@凌驾
公共无效启动(Intent Intent,int startId){
Log.d(标签“onStart”);
postDelayed(updateTimerThread,0);
}
@凌驾
公共空间{
Log.d(标签“onDestroy”);
}
private Runnable updateTimerThread=new Runnable(){
@凌驾
公开募捐{
//TODO自动生成的方法存根
新建syncGetHeartbeat().execute();
日志d(“发送hearbeat”、“发送HearRrRrBeat”);
customHandler.postDelayed(这是260000);
}
};
类syncGetHeartbeat扩展异步任务{
@凌驾
受保护的字符串背景(无效…未指定){
试试{
字符串varId=“naengoland”;
字符串url=”http://mydomain.com/gcmserver/getHeartbeat.php?id=“+varId;
getRequestJSON(url);
返回null;
}捕获(例外e){
Log.e(e.getClass().getName(),“service get hertbeat”+e.toString());
返回null;
}
}
@凌驾
受保护的void onProgressUpdate(void…unseed){
}
@凌驾
PostExecute上受保护的void(字符串响应){
}
}
公共字符串getRequestJSON(字符串Url){
HttpClient=new DefaultHttpClient();
HttpGet请求=新的HttpGet(Url);
试一试{
执行(请求);
}捕获(例外情况除外){
}
返回null;
}
}
我成功地每5分钟发送一次心跳,但问题是我的应用程序运行缓慢,并且消耗了大量电池,除了按我的方式发送之外,还有其他方法发送心跳吗? 我的意思是,比我的方法更好的方法


请提供帮助。

使用
TimerTask
比使用线程提供更好的性能。。但是
TimerTask
不适合同时处理多个线程,这在您的案例中并不重要,因为您重复执行一个任务

以下是计时器的代码:

首先初始化
计时器

private Timer timer;
onCreate
中:

timer = new Timer();
然后在
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
我不确定是否有其他解决方案具有更好的性能,但这绝对比以固定速率运行线程要好