我使用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分钟成功发送一次心跳,但问题是我的应用程序运行缓慢而且消耗电池很多,有什么方法可以发送心跳旁边的方式吗? 我的意思是,比我的方法更好的方法。
请帮忙。
答案 0 :(得分:0)
使用TimerTask
提供比使用线程(ref)更好的性能。但是TimerTask
不能同时处理多个线程,这在您的情况下不是问题,因为你是在反复做一个任务。
这是Timer的代码:
首先初始化Timer
:
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
我不确定是否有其他解决方案具有更好的性能,但这绝对比以固定速率运行线程更好。