OSDN Git Service

performance improved
authorkazhik <kazhik@gmail.com>
Thu, 5 Nov 2009 12:41:29 +0000 (21:41 +0900)
committerkazhik <kazhik@gmail.com>
Thu, 5 Nov 2009 12:41:29 +0000 (21:41 +0900)
src/net/kazhik/android/tokyorunners/MapMode.java
src/net/kazhik/android/tokyorunners/RunningHistory.java
src/net/kazhik/android/tokyorunners/RunningRecord.java
src/net/kazhik/android/tokyorunners/TokyoRunners.java

index 60d65e7..3246174 100755 (executable)
@@ -3,6 +3,7 @@ package net.kazhik.android.tokyorunners;
 import java.text.SimpleDateFormat;\r
 import java.util.ArrayList;\r
 import java.util.Date;\r
+import java.util.Iterator;\r
 import java.util.List;\r
 \r
 import android.app.AlertDialog;\r
@@ -12,7 +13,6 @@ import android.content.Context;
 import android.content.DialogInterface;\r
 import android.content.Intent;\r
 import android.content.IntentFilter;\r
-import android.content.SharedPreferences;\r
 import android.graphics.Canvas;\r
 import android.graphics.Color;\r
 import android.graphics.Paint;\r
@@ -20,13 +20,10 @@ import android.graphics.Path;
 import android.graphics.Point;\r
 import android.graphics.drawable.Drawable;\r
 import android.os.Bundle;\r
-import android.preference.PreferenceManager;\r
+import android.os.Debug;\r
 import android.util.Log;\r
 import android.view.KeyEvent;\r
-import android.view.Menu;\r
 import android.view.MenuItem;\r
-import android.view.View;\r
-import android.view.View.OnLongClickListener;\r
 import android.widget.Toast;\r
 \r
 import com.google.android.maps.GeoPoint;\r
@@ -46,6 +43,7 @@ public class MapMode extends MapActivity {
        private SplitPoints m_overlaySplitpoints;\r
        private GeoPoint m_prevPoint = null;\r
        private long m_startTime = 0;\r
+       private final SimpleDateFormat m_timeFormatter = new SimpleDateFormat("HH:mm:ss");\r
 \r
        public class RunningRoute extends Overlay {\r
 \r
@@ -165,7 +163,6 @@ public class MapMode extends MapActivity {
 \r
        @Override\r
        public void onResume() {\r
-               Log.d(this.getClass().getName(), "onResume()");\r
                super.onResume();\r
                IntentFilter filter = new IntentFilter();\r
                filter.addAction("NewRunningRecord");\r
@@ -206,7 +203,9 @@ public class MapMode extends MapActivity {
                Drawable runner = getResources().getDrawable(R.drawable.runner);\r
                m_overlaySplitpoints = new SplitPoints(runner);\r
 \r
+               long time1 = System.currentTimeMillis();\r
                drawOverlays(mapView);\r
+               Log.d(this.getClass().getName(), "drawOverlays() -- " + (System.currentTimeMillis() - time1));\r
        }\r
        \r
        private void drawOverlays(MapView mapView) {\r
@@ -220,9 +219,9 @@ public class MapMode extends MapActivity {
 \r
                m_overlaySplitpoints.clearItem();\r
                \r
-               long recTime = 0;\r
-               Record rec;\r
-               while ((rec = TokyoRunners.getNextRecord(recTime)) != null) {\r
+               Iterator<Record> it = TokyoRunners.getRecordIterator();\r
+               while (it.hasNext()) {\r
+                       Record rec = it.next();\r
                        if (rec.hasLocation()) {\r
                                GeoPoint gp = new GeoPoint(rec.getLatitudeE6(), rec\r
                                                .getLongitudeE6());\r
@@ -236,17 +235,15 @@ public class MapMode extends MapActivity {
                                        drawSplitPoint(gp, rec.getName(), rec.getDate());\r
                                }\r
                        }\r
-                       recTime = rec.getDate().getTime();\r
                        if (m_startTime == 0) {\r
-                               m_startTime = recTime;\r
+                               m_startTime = rec.getDate().getTime();\r
                        }\r
                }\r
                \r
        }\r
 \r
        private void drawSplitPoint(GeoPoint gp, String pointName, Date recDate) {\r
-               SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");\r
-               String snippet = pointName + "[" + formatter.format(recDate) + "]";\r
+               String snippet = pointName + "[" + m_timeFormatter.format(recDate) + "]";\r
                OverlayItem ovItem = new OverlayItem(gp, "", snippet);\r
                m_overlaySplitpoints.addSplitpoint(ovItem);\r
                if (m_overlaySplitpoints.size() == 1) {\r
@@ -255,7 +252,6 @@ public class MapMode extends MapActivity {
        }\r
 \r
        public boolean onKeyDown(int keyCode, KeyEvent event) {\r
-               Log.d(this.getClass().getName(), "onKeyDown():" + keyCode);\r
                if (keyCode == KeyEvent.KEYCODE_BACK) {\r
                        showDialog(Constants.DIALOG_EXIT_ID);\r
                        return true;\r
@@ -277,6 +273,7 @@ public class MapMode extends MapActivity {
                                        new DialogInterface.OnClickListener() {\r
                                                @Override\r
                                                public void onClick(DialogInterface dialog, int which) {\r
+                                                       Debug.stopMethodTracing();\r
                                                        finish();\r
 \r
                                                }\r
index 803e51a..cbde72b 100644 (file)
@@ -7,15 +7,14 @@ import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.Formatter;
 import java.util.HashMap;
-import java.util.Iterator;
 
 import android.app.ListActivity;
 import android.content.Intent;
 import android.database.Cursor;
 import android.os.Bundle;
 import android.os.Environment;
-import android.util.Log;
 import android.view.ContextMenu;
 import android.view.Menu;
 import android.view.MenuItem;
@@ -27,7 +26,7 @@ import android.widget.AdapterView.AdapterContextMenuInfo;
 import android.widget.AdapterView.OnItemClickListener;
 
 public class RunningHistory extends ListActivity implements OnItemClickListener {
-    private SimpleDateFormat m_startTimeFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
+    private SimpleDateFormat m_startTimeFormatter = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
     private HashMap<Long, Long> m_startTimeMap = new HashMap<Long, Long>();
        
        private static final int MENU_DELETE_THIS = Menu.FIRST + 200;
@@ -47,6 +46,7 @@ public class RunningHistory extends ListActivity implements OnItemClickListener
         // 履歴データを読み込む
         String[] columns = {
                        RunningRecordProvider.START_TIME,
+                       RunningRecordProvider.CURRENT_TIME,
                        RunningRecordProvider.DISTANCE};
         String sortOrder = RunningRecordProvider.CURRENT_TIME + " desc";
         Cursor cursor = managedQuery(RunningRecordProvider.REC_URI, columns, null, null, sortOrder);
@@ -56,11 +56,13 @@ public class RunningHistory extends ListActivity implements OnItemClickListener
         }
         ArrayList<String> history = new ArrayList<String>();
        long startTime = 0;
+       long currentTime = 0;
        float distance = 0;
        long prevStartTime = 0;
         while (cursor.moveToNext()) {
                startTime = cursor.getLong(0);
-               distance = (float)cursor.getLong(1);
+               currentTime = cursor.getLong(1);
+               distance = (float)cursor.getLong(2);
 //             Log.d(this.getClass().getName(), "startTime:" + startTime +  "; distance:" + distance);
                
                if (startTime == prevStartTime) {
@@ -75,6 +77,15 @@ public class RunningHistory extends ListActivity implements OnItemClickListener
                rowStr.append("  ");
 
                rowStr.append(distance / 1000);
+               rowStr.append("km"); // TODO: i18n
+               rowStr.append("  ");
+
+               long finalTime = currentTime - startTime;
+               Formatter finalTimeFormatter = new Formatter();
+               rowStr.append(finalTimeFormatter.format("%d:%02d:%02d",
+                               finalTime / 1000 / 60 / 60,
+                               finalTime / 1000 / 60 % 60,
+                               finalTime / 1000 % 60));
                history.add(rowStr.toString());
         }
         ArrayAdapter<String> historyArray = new ArrayAdapter<String>(this, R.layout.runningrecord, history);
@@ -124,14 +135,14 @@ public class RunningHistory extends ListActivity implements OnItemClickListener
                String[] splitStr = historyArray.getItem(position).split(" ");
                String dateStr = splitStr[0] + " " + splitStr[1];
                long startTime = 0;
-               try {
-                       startTime = m_startTimeFormatter.parse(dateStr).getTime();
-                       startTime = m_startTimeMap.get(startTime);
-               } catch (ParseException e) {
-                       e.printStackTrace();
-               }
                switch (item.getItemId()) {
                case MENU_DELETE_THIS:
+                       try {
+                               startTime = m_startTimeFormatter.parse(dateStr).getTime();
+                               startTime = m_startTimeMap.get(startTime);
+                       } catch (ParseException e) {
+                               e.printStackTrace();
+                       }
 
                        String selection = RunningRecordProvider.START_TIME + " = ?";
                        String[] selectionArgs = { Long.toString(startTime) };
@@ -147,6 +158,12 @@ public class RunningHistory extends ListActivity implements OnItemClickListener
                        historyArray.clear();
                        break;
                case MENU_SAVE_GPX:
+                       try {
+                               startTime = m_startTimeFormatter.parse(dateStr).getTime();
+                               startTime = m_startTimeMap.get(startTime);
+                       } catch (ParseException e) {
+                               e.printStackTrace();
+                       }
                        saveRecordAsGpxFile(startTime);
                        break;
                default:
index 2912c60..4f83081 100755 (executable)
@@ -30,12 +30,14 @@ public class RunningRecord {
                m_contentResolver = contentResolver;\r
        }\r
        public String addRecord(Date date, Location loc, String pointName, boolean persistent) {\r
+               //Log.d(this.getClass().getName(), date.toLocaleString());\r
                // これまでの走行距離を計算\r
                if (m_prevLocation != null && loc != null) {\r
                        float distance = m_prevLocation.distanceTo(loc);\r
-                       Log.d(this.getClass().getName(), "distance: " + distance);\r
+//                     Log.d(this.getClass().getName(), "distance: " + distance);\r
                        m_distance += m_prevLocation.distanceTo(loc);\r
-               } else {\r
+               }\r
+               if (m_startTime == 0) {\r
                        m_startTime = date.getTime();\r
                }\r
                m_prevLocation = loc;\r
@@ -100,6 +102,10 @@ public class RunningRecord {
                \r
                return null;\r
        }\r
+       public Iterator<Record> getIterator() {\r
+               return m_recordList.iterator();\r
+       }\r
+       \r
        public Record getNextRecord(Date date) {\r
                Record rec = null;\r
                \r
index 6f14d32..a031028 100755 (executable)
@@ -1,6 +1,7 @@
 package net.kazhik.android.tokyorunners;
 
 import java.util.Date;
+import java.util.Iterator;
 
 import android.app.AlertDialog;
 import android.app.Dialog;
@@ -14,7 +15,10 @@ import android.location.Location;
 import android.location.LocationListener;
 import android.location.LocationManager;
 import android.location.LocationProvider;
+import android.media.AudioManager;
+import android.media.ToneGenerator;
 import android.os.Bundle;
+import android.os.Debug;
 import android.os.SystemClock;
 import android.preference.PreferenceManager;
 import android.text.format.DateUtils;
@@ -72,7 +76,7 @@ public class TokyoRunners extends TabActivity implements LocationListener {
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
 
-//             Debug.startMethodTracing("tokyorunners");
+               Debug.startMethodTracing("tokyorunners");
 
                setContentView(R.layout.stopwatch);
 
@@ -246,12 +250,11 @@ public class TokyoRunners extends TabActivity implements LocationListener {
 
        @Override
        public void onDestroy() {
+               Log.d(this.getClass().getName(), "onDestroy():");
                getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
 
                m_runningRecord = null;
 
-//             Debug.stopMethodTracing();
-
                if (m_useGPS) {
                        m_locMgr.removeUpdates(this);
                }
@@ -294,6 +297,7 @@ public class TokyoRunners extends TabActivity implements LocationListener {
                                        new DialogInterface.OnClickListener() {
                                                @Override
                                                public void onClick(DialogInterface dialog, int which) {
+                                                       Debug.stopMethodTracing();
                                                        finish();
 
                                                }
@@ -344,6 +348,17 @@ public class TokyoRunners extends TabActivity implements LocationListener {
                        return;
                }
                
+               // 音声出力でスタートを知らせる
+               Location prevLocation = m_runningRecord.getPrevLocation();
+               if (prevLocation == null) {
+                       ToneGenerator toneGenerator = new ToneGenerator(
+                               AudioManager.STREAM_SYSTEM,
+                               ToneGenerator.MAX_VOLUME);
+                       toneGenerator.startTone(ToneGenerator.TONE_PROP_BEEP);
+                       toneGenerator.stopTone();
+               }
+
+               
                // 精度が低いデータは無視
                // 移動距離が精度より小さい場合も無視
                if (location.hasAccuracy()) {
@@ -351,7 +366,6 @@ public class TokyoRunners extends TabActivity implements LocationListener {
                                ExLog.put("Accuracy low: " + location.getAccuracy() + ";" + m_minAccuracy);
                                return;
                        }
-                       Location prevLocation = m_runningRecord.getPrevLocation();
                        if (prevLocation != null && prevLocation.distanceTo(location) < location.getAccuracy()) {
                                ExLog.put("Move not enough: " + location.getAccuracy() + ";" + prevLocation.distanceTo(location));
                                return;
@@ -421,7 +435,9 @@ public class TokyoRunners extends TabActivity implements LocationListener {
                m_elapsedTime.start();
                m_lapTime.start();
 
-               m_runningRecord.addRecord(new Date(), null, "");
+               Location startPoint = m_locMgr.getLastKnownLocation(LocationManager.GPS_PROVIDER);
+               
+               m_runningRecord.addRecord(new Date(), startPoint, "start");
 
                Button startStopButton = (Button) findViewById(R.id.button_start_stop);
                Button resetLapButton = (Button) findViewById(R.id.button_reset_lap);
@@ -435,7 +451,9 @@ public class TokyoRunners extends TabActivity implements LocationListener {
        }
 
        private void stop() {
-               m_runningRecord.addRecord(new Date(), null, "");
+               Location finishPoint = m_locMgr.getLastKnownLocation(LocationManager.GPS_PROVIDER);
+
+               m_runningRecord.addRecord(new Date(), finishPoint, "finish");
 
                m_elapsedTime.stop();
                m_lapTime.stop();
@@ -511,6 +529,9 @@ public class TokyoRunners extends TabActivity implements LocationListener {
                return m_runningRecord.getNextRecord(new Date(recordTime));
 
        }
+       public static Iterator<Record> getRecordIterator() {
+               return m_runningRecord.getIterator();
+       }
 
        @Override
        public boolean dispatchKeyEvent(KeyEvent event) {