2012-07-16 173 views
-1

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

      } 


     } 
+0

你是什么意思“它不工作”。添加一些调试日志记录,看看发生了什么。你有没有发布'getData' Runnable?它只运行一次吗?它是否将任何错误写入logcat? – 2012-07-16 16:12:10

+0

没有错误,它只运行一次。 – 2012-07-16 16:42:51

+0

AsyncTask只运行一次?或者getData Runnable只运行一次? – 2012-07-16 17:11:33

回答

0

只需使用一个TimerTimerTask并运行固定利率scheduleAtFixedRate()

0

而不是使用服务ce每隔一分钟轮询一次服务器,为什么不使用Google Cloud Messaging for android(以前的C2DM)..这样,您可以向您的应用程序发送一些通知,以便在服务器上更改数据,然后引导您更改如果需要,你的数据库中的一些数据,然后启动线程。 但是,我真的没有任何关于您的实际需求的想法

相关问题