-1

我试图通过使用处理程序每​​ 1 分钟运行一次 AsyncTask,但它不起作用:( 在 AsyncTask 中,我正在从 Sqlite DB 读取数据并在 mapview 中绘制结果,这样做的目的是每 1 次更新我的 Sqlite 的另一项服务min 通过从服务器获取真实数据,我也希望保持 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);

             }


         }
4

3 回答 3

1

使用按分钟运行的广播意图,然后执行异步任务。它更准确。

http://developer.android.com/reference/android/content/Intent.html#ACTION_TIME_TICK

确保new每次都创建实例,因为除非创建新实例,否则无法重用/重新启动线程对象。

http://developer.android.com/guide/components/processes-and-threads.html

于 2012-07-16T18:23:28.487 回答
0

只需使用Timer,TimerTask并以固定速率运行scheduleAtFixedRate()

于 2012-07-16T16:55:29.217 回答
0

与其使用服务每分钟轮询一次服务器,不如使用适用于 android 的 Google Cloud Messaging(以前称为 C2DM)。这样,您可以向您的应用发送一些通知,表明服务器上的数据已更改,然后如果需要,引导您更改数据库中的一些数据,然后启动线程。但是,是的,我真的对您的实际要求一无所知

于 2012-07-16T18:18:38.960 回答