-1

ハンドラーを使用して1分ごとにAsyncTaskを実行しようとしていますが、機能しません:( AsyncTaskでは、Sqlite DBからデータを読み取り、mapviewで結果を描画しています。そのようにすることを目的として、Sqliteを1ごとに更新する別のサービスです。サーバーから実際のデータを取得し、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);

             }


         }
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

を使用するだけTimerTimerTask、固定レートで実行できますscheduleAtFixedRate()

于 2012-07-16T16:55:29.217 に答える
0

サービスを使用して 1 分ごとにサーバーをポーリングする代わりに、android 用の Google クラウド メッセージング (以前は C2DM) を使用しないでください。そのようにして、サーバー上でデータが変更されたという通知をアプリに送信できます。必要に応じてデータベース内のデータを変更してから、スレッドを開始します。しかし、はい、あなたの実際の要件についてはまったくわかりません

于 2012-07-16T18:18:38.960 に答える