如何每分钟运行一次AsyncTask?
问题描述:
我想通过使用处理程序每隔1分钟运行一次AsyncTask,但它不起作用:( 在AsyncTask中我正在从Sqlite数据库读取数据并在mapview中绘制结果,这样做的目的是另一项服务更新我的SQLite的每1分钟由服务器以实际的数据,我想保留的MapView更新过。 是否有打电话的AsyncTask每分钟,而不是使用处理器的任何可能的方式?如何每分钟运行一次AsyncTask?
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);
}
}
答
使用运行在分钟刻度上的广播意图,然后执行异步任务。它更准确。
http://developer.android.com/reference/android/content/Intent.html#ACTION_TIME_TICK
确保你创建的每一个时间new
例如,由于线程对象不能重复使用/重新启动,除非您创建新实例。
http://developer.android.com/guide/components/processes-and-threads.html
答
只需使用一个Timer
,TimerTask
并运行固定利率scheduleAtFixedRate()
答
而不是使用服务ce每隔一分钟轮询一次服务器,为什么不使用Google Cloud Messaging for android(以前的C2DM)..这样,您可以向您的应用程序发送一些通知,以便在服务器上更改数据,然后引导您更改如果需要,你的数据库中的一些数据,然后启动线程。 但是,我真的没有任何关于您的实际需求的想法
你是什么意思“它不工作”。添加一些调试日志记录,看看发生了什么。你有没有发布'getData' Runnable?它只运行一次吗?它是否将任何错误写入logcat? – 2012-07-16 16:12:10
没有错误,它只运行一次。 – 2012-07-16 16:42:51
AsyncTask只运行一次?或者getData Runnable只运行一次? – 2012-07-16 17:11:33