Android 如何每分钟运行一次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();

我尝试使用处理程序每1分钟运行一次AsyncTask,但它不起作用:( 在AsyncTask中,我从Sqlite DB读取数据并在mapview中绘制结果,这样做的目的是通过从服务器获取真实数据,每1分钟更新一次Sqlite,我还希望保持mapview的更新。 是否有任何可能的方法每分钟调用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);

             }


         }
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只运行一次?