Android 发送心跳gcm?
我使用GCM开发android应用程序,我想每5分钟发送一次心跳,我在服务运行时创建它,这些是我的代码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
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
我不确定是否有其他解决方案具有更好的性能,但这绝对比以固定速率运行线程要好