Android 如何每分钟运行一次AsyncTask?
我尝试使用处理程序每1分钟运行一次AsyncTask,但它不起作用:( 在AsyncTask中,我从Sqlite DB读取数据并在mapview中绘制结果,这样做的目的是通过从服务器获取真实数据,每1分钟更新一次Sqlite,我还希望保持mapview的更新。 是否有任何可能的方法每分钟调用AsyncTask而不是使用处理程序Android 如何每分钟运行一次AsyncTask?,android,sqlite,google-maps-api-3,Android,Sqlite,Google Maps Api 3,我尝试使用处理程序每1分钟运行一次AsyncTask,但它不起作用:( 在AsyncTask中,我从Sqlite DB读取数据并在mapview中绘制结果,这样做的目的是通过从服务器获取真实数据,每1分钟更新一次Sqlite,我还希望保持mapview的更新。 是否有任何可能的方法每分钟调用AsyncTask而不是使用处理程序 public Runnable getData; private final Handler _handler = new Handler();
public Runnable getData;
private final Handler _handler = new Handler();
private static int DATA_INTERVAL = 60 * 1000;
getData = new Runnable()
{
public void run()
{
getDataFrame();
}
private void getDataFrame() {
// TODO Auto-generated method stub
_handler.postDelayed(MapViewActivity.this.getData, DATA_INTERVAL);
new DrawFromDataTask();
}
};
DrawFromDataTask is described below:
private class DrawFromDataTask extends AsyncTask<Void, Integer, FriendItemizedOverlay> {
@Override
protected FriendItemizedOverlay doInBackground(Void... params) {
// TODO Auto-generated method stub
mDbAdapter.open();
List<Refresher> nearFriends = mDbAdapter.getAllRecords();
for(Refresher friend : nearFriends)
{
double lat = Double.parseDouble(friend.Latitude);
double lon = Double.parseDouble(friend.Longitude);
OverlayItem item = new OverlayItem(new GeoPoint((int)(lat * 1000000),
(int)(lon* 1000000)),
"" + friend.name,
"" + friend.type);
mFriendOverlay.addOverlay(item);
}
return mFriendOverlay;
}
protected void onProgressUpdate(Integer... progress) {
setProgress(progress[0]);
}
protected void onPostExecute(FriendItemizedOverlay result) {
System.out.println("in AsyncTask execution!");
Location loc = get_location();
final double mLatitude = loc.getLatitude();
final double mLongitude = loc.getLongitude();
// get the last location from the database
GeoPoint lastLocation = new GeoPoint(
(int) (mLatitude * 1E6),
(int) (mLongitude * 1E6));
Drawable marker = getResources().getDrawable(R.drawable.arrow);
int amountOFplayers = result.size()-1;
for (int j=0; j<amountOFplayers; j++) {
result.getItem(amountOFplayers).setMarker(marker);
}
//System.out.println("Number of overlays -- "+amountOFplayers);
mMapView.postInvalidate();
//mMapView.invalidate();
// animate to last location
mMapController.animateTo(lastLocation);
// zoom to the required level
mMapController.setZoom(ZOOM_LEVEL);
}
}
public可运行getData;
私有最终处理程序_Handler=new Handler();
专用静态整数数据间隔=60*1000;
getData=newrunnable()
{
公开募捐
{
getDataFrame();
}
私有void getDataFrame(){
//TODO自动生成的方法存根
_handler.postDelayed(MapViewActivity.this.getData,数据间隔);
新建DrawFromDataTask();
}
};
DrawFromDataTask描述如下:
私有类DrawFromDataTask扩展了AsyncTask{
@凌驾
受保护的FriendItemizeOverlay doInBackground(无效…参数){
//TODO自动生成的方法存根
mDbAdapter.open();
List nearFriends=mDbAdapter.getAllRecords();
用于(复习朋友:近朋友)
{
double lat=double.parseDouble(友元纬度);
double lon=double.parseDouble(友元.经度);
叠加项目=新叠加项目(新地质点((int)(纬度*1000000),
(国际)(伦敦*1000000)),
“”+friend.name,
“”+friend.type);
mFriendOverlay.addOverlay(项目);
}
返回多佛莱;
}
受保护的void onProgressUpdate(整数…进度){
setProgress(progress[0]);
}
PostExecute上受保护的void(FriendItemizedOverlay结果){
System.out.println(“异步任务执行中!”);
位置loc=获取位置();
最终双精度纬度=loc.getLatitude();
最终双倍长度=loc.getLongitude();
//从数据库中获取最后一个位置
地质点lastLocation=新地质点(
(国际)(mLatitude*1E6),
(内部)(长度*1E6));
Drawable marker=getResources().getDrawable(R.Drawable.arrow);
int amountOFplayers=result.size()-1;
对于(int j=0;j只需使用计时器,TimerTask
并以固定速率运行scheduleAtFixedRate()
而不是使用服务每分钟轮询一次服务器,为什么不使用android的Google Cloud Messaging(以前的C2DM)…通过这种方式,您可以向应用程序发送一些通知,告知服务器上的“是”数据已更改,然后根据需要更改数据库中的某些数据,然后启动线程。
但是,是的,我真的不知道您的实际需求。使用在分钟内运行的广播意图,然后执行异步任务。它更准确
确保每次都创建new
实例,因为除非创建新实例,否则无法重用/重新启动线程对象
什么是“它不工作”。添加一些调试日志,看看发生了什么。您是否发布过getData
Runnable?它是否只运行一次?它是否向logcat写入任何错误?没有错误,它只运行一次。AsyncTask只运行一次?getData Runnable只运行一次?