我试图通过使用处理程序每1分钟运行一次AsyncTask,但它不起作用:( 在AsyncTask中我正在从Sqlite DB读取数据并在mapview中绘制结果,这样做的目的是通过从服务器获取实际数据每隔1分钟更新我的Sqlite的另一个服务,我也希望保持mapview更新。 是否有可能每分钟调用AsyncTask而不是使用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);
}
}
答案 0 :(得分:1)
使用在分钟刻度线上运行的广播意图,然后执行异步任务。它更准确。
http://developer.android.com/reference/android/content/Intent.html#ACTION_TIME_TICK
确保每次都创建new
实例,因为除非您创建新实例,否则无法重用/重新启动线程对象。
http://developer.android.com/guide/components/processes-and-threads.html
答案 1 :(得分:0)
只需使用Timer
,TimerTask
并以固定费率运行scheduleAtFixedRate()
答案 2 :(得分:0)
为什么不使用服务每分钟轮询一次服务器,为什么不使用Google Cloud Messaging for android(以前的C2DM)..这样你就可以向你的应用发送一些通知,即服务器上的数据是否已更改,然后引导您根据需要更改数据库中的某些数据,然后启动该线程。 但是,我真诚地对您的实际要求一无所知