如何每分钟运行Async Task?

时间:2012-07-16 15:38:09

标签: android sqlite google-maps-api-3

我试图通过使用处理程序每​​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);

             }


         }

3 个答案:

答案 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)

只需使用TimerTimerTask并以固定费率运行scheduleAtFixedRate()

答案 2 :(得分:0)

为什么不使用服务每分钟轮询一次服务器,为什么不使用Google Cloud Messaging for android(以前的C2DM)..这样你就可以向你的应用发送一些通知,即服务器上的数据是否已更改,然后引导您根据需要更改数据库中的某些数据,然后启动该线程。 但是,我真诚地对您的实际要求一无所知