Best Android App InstaSquare Lite for full-size publication of photos in Instagram, Facebook, Twitter. Run the android application on PC. You can through the android emulator Droid4X.

Changeset 129

Show
Ignore:
Timestamp:
02/08/09 21:31:46 (12 months ago)
Author:
dmyung
Message:

- fixed db startup procedure for blank phones.
- fixed inefficient lookup/insert of monitors on new message receipts.
- profiler has shown that datetime formatting is an expensive operation on message reciept.
- proifle also shows that form lookup is inefficient due to the cache being rebuilt every time. perhaps cache it on application bootstrap?

Location:
trunk
Files:
8 modified

Legend:

Unmodified
Added
Removed
  • trunk/rapidandroid/org.rapidandroid/src/org/rapidandroid/RapidAndroidApplication.java

    r128 r129  
    1919                // TODO Auto-generated method stub 
    2020                super.onCreate();                
     21                Debug.startMethodTracing("rapidandroid_application"); 
    2122                ModelBootstrap.InitApplicationDatabase(this.getApplicationContext()); 
    2223                 
  • trunk/rapidandroid/org.rapidandroid/src/org/rapidandroid/activity/Dashboard.java

    r128 r129  
    522522 
    523523        private void startActivityChart() { 
     524                Debug.stopMethodTracing(); 
    524525                if (mListviewCursor == null) { 
    525526                        Builder noDataDialog = new AlertDialog.Builder(this); 
  • trunk/rapidandroid/org.rapidandroid/src/org/rapidandroid/activity/chart/ChartBroker.java

    r128 r129  
    5656        protected Date mStartDate = Constants.NULLDATE; 
    5757        protected Date mEndDate = Constants.NULLDATE; 
     58//      protected Calendar mStartCal = Constants.NULLCALENDAR;  //we may need to switch to using calendar's due to the sheer number of conversions we're doing with them back and forth. 
     59//      protected Calendar mEndCal = Constants.NULLCALENDAR; 
    5860         
    5961        protected SmsDbHelper rawDB; 
  • trunk/rapidandroid/org.rapidandroid/src/org/rapidandroid/content/translation/MessageTranslator.java

    r122 r129  
    1616/** 
    1717 * Helper class to simplify the insertion and querying of raw SMS messages from 
    18  * the content provider.   
    19  *  
    20  * <br>Goal for this class is to return Message objects instead of cursors.  
     18 * the content provider. 
     19 *  
     20 * <br> 
     21 * Goal for this class is to return Message objects instead of cursors. 
    2122 *  
    2223 * @author Daniel Myung [email protected] 
     
    3031        private static HashMap<Integer, Monitor> mMonitorHash = new HashMap<Integer, Monitor>(); 
    3132        private static HashMap<String, Monitor> mMonitorHashByPhone = new HashMap<String, Monitor>(); 
    32          
     33 
    3334        /** 
    34          * To ease DB hits on the insert of messages, the monitorhash has two hastables indexed by phone number and ID. 
    35          * We need to update this thing on each new insert. 
     35         * To ease DB hits on the insert of messages, the monitorhash has two 
     36         * hastables indexed by phone number and ID. We need to update this thing on 
     37         * each new insert. 
     38         *  
    3639         * @param context 
    3740         */ 
     
    4043                mMonitorHash = new HashMap<Integer, Monitor>(); 
    4144                mMonitorHashByPhone = new HashMap<String, Monitor>(); 
    42                 Cursor monitorCursor = context.getContentResolver().query(RapidSmsDBConstants.Monitor.CONTENT_URI, null, null, 
    43                                                                                                                                         null, null); 
    44                 if (monitorCursor.getCount() == 0) { 
    45                         monitorCursor.close(); 
    46                         return; 
    47                 } 
    48                  
    49  
    50                 monitorCursor.moveToFirst(); 
    51  
    52                 do { 
    53                         // (int id, String firstName, String lastName, String alias, 
    54                         // String phone, String email, int incomingMessages) { 
    55                          
    56                  
    57                          
    58                         Monitor newMonitor = new Monitor(monitorCursor.getInt(Monitor.COL_ID), 
    59                                                                                                 monitorCursor.getString(Monitor.COL_FIRSTNAME), 
    60                                                                                                 monitorCursor.getString(Monitor.COL_LASTNAME), 
    61                                                                                                 monitorCursor.getString(Monitor.COL_ALIAS), 
    62                                                                                                 monitorCursor.getString(Monitor.COL_PHONE), 
    63                                                                                                 monitorCursor.getString(Monitor.COL_EMAIL), 
    64                                                                                                 monitorCursor.getInt(Monitor.COL_MESSAGECOUNT), 
    65                                                                                                 monitorCursor.getInt(Monitor.COL_RECEIVE_REPLY)==1); 
    66                         mMonitorHash.put(Integer.valueOf(newMonitor.getID()), newMonitor); 
    67                         mMonitorHashByPhone.put(newMonitor.getPhone(), newMonitor); 
    68                 } while (monitorCursor.moveToNext()); 
     45                Cursor monitorCursor = context.getContentResolver() 
     46                                .query(RapidSmsDBConstants.Monitor.CONTENT_URI, null, null, 
     47                                                null, null); 
     48                // if (monitorCursor.getCount() == 0) { 
     49                // monitorCursor.close(); 
     50                // return; 
     51                // } 
     52 
     53                if (monitorCursor.moveToFirst()) { 
     54 
     55                        do { 
     56                                // (int id, String firstName, String lastName, String alias, 
     57                                // String phone, String email, int incomingMessages) { 
     58 
     59                                Monitor newMonitor = new Monitor(monitorCursor 
     60                                                .getInt(Monitor.COL_ID), monitorCursor 
     61                                                .getString(Monitor.COL_FIRSTNAME), monitorCursor 
     62                                                .getString(Monitor.COL_LASTNAME), monitorCursor 
     63                                                .getString(Monitor.COL_ALIAS), monitorCursor 
     64                                                .getString(Monitor.COL_PHONE), monitorCursor 
     65                                                .getString(Monitor.COL_EMAIL), monitorCursor 
     66                                                .getInt(Monitor.COL_MESSAGECOUNT), monitorCursor 
     67                                                .getInt(Monitor.COL_RECEIVE_REPLY) == 1); 
     68                                mMonitorHash.put(Integer.valueOf(newMonitor.getID()), 
     69                                                newMonitor); 
     70                                mMonitorHashByPhone.put(newMonitor.getPhone(), newMonitor); 
     71                        } while (monitorCursor.moveToNext()); 
     72                } 
     73 
    6974                monitorCursor.close(); 
    7075        } 
     
    7277        /** 
    7378         * Get a handle to monitor for a given ID 
     79         *  
    7480         * @param context 
    7581         * @param monitorID 
     
    8288                } else { 
    8389                        throw new IllegalArgumentException( 
    84                                                                                                 "Error in application state.  The monitor hash should always be up to date when querying"); 
     90                                        "Error in application state.  The monitor hash should always be up to date when querying"); 
    8591                } 
    8692        } 
     
    8894        /** 
    8995         * Get a monitor or insert a new one based upon a given phone number 
    90          *   
    91          * @returns The monitor found or created.  This is necesary to do link a new message to a Monitor.ID 
     96         *  
     97         * @returns The monitor found or created. This is necesary to do link a new 
     98         *          message to a Monitor.ID 
    9299         *  
    93100         */ 
    94101        public static synchronized Monitor GetMonitorAndInsertIfNew(Context context, String phone) { 
    95                  
    96                  
    97102                if (mMonitorHashByPhone.containsKey(phone)) { 
    98103                        return mMonitorHashByPhone.get(phone); 
     
    101106                        cv.put(RapidSmsDBConstants.Monitor.PHONE, phone); 
    102107                        Uri newUri = context.getContentResolver().insert(RapidSmsDBConstants.Monitor.CONTENT_URI, cv); 
    103                         updateMonitorHash(context); 
     108                        //updateMonitorHash(context); 
    104109                        return mMonitorHashByPhone.get(phone); 
    105110                } 
     
    111116                } 
    112117 
    113                 Uri getMessageUri = Uri.parse(RapidSmsDBConstants.Message.CONTENT_URI_STRING + messageID); 
    114  
    115                 Cursor msgCursor = context.getContentResolver().query(getMessageUri, null, null, null, null); 
     118                Uri getMessageUri = Uri 
     119                                .parse(RapidSmsDBConstants.Message.CONTENT_URI_STRING 
     120                                                + messageID); 
     121 
     122                Cursor msgCursor = context.getContentResolver().query(getMessageUri, 
     123                                null, null, null, null); 
    116124                msgCursor.moveToFirst(); 
    117125                if (msgCursor.getCount() != 1) { 
     126                        msgCursor.close(); 
    118127                        return null; 
    119128                } else { 
     
    121130                                String datestring = msgCursor.getString(Message.COL_TIME); 
    122131                                Date msgDate = Message.SQLDateFormatter.parse(datestring); 
    123                                  
    124                                 String recvstring = msgCursor.getString(Message.COL_RECEIVE_TIME); 
    125                                 Date recvDate = msgDate;        //for old entries, should we set it to null or just copy it? 
    126                                 if(recvstring == null || recvstring == "") { 
     132 
     133                                String recvstring = msgCursor 
     134                                                .getString(Message.COL_RECEIVE_TIME); 
     135                                Date recvDate = msgDate; // for old entries, should we set it to 
     136                                                                                        // null or just copy it? 
     137                                if (recvstring == null || recvstring == "") { 
    127138                                        recvDate = Message.SQLDateFormatter.parse(datestring); 
    128139                                } 
    129                                  
    130  
    131                                 Message newMessage = new Message( 
    132                                                                                                         msgCursor.getInt(Message.COL_ID), 
    133                                                                                                         msgCursor.getString(Message.COL_MESSAGE), 
    134                                                                                                         msgDate, 
    135                                                                                                         mMonitorHash.get(Integer.valueOf(msgCursor.getInt(Message.COL_MONITOR))), 
    136                                                                                                         recvDate 
    137                                 ); 
     140 
     141                                Message newMessage = new Message(msgCursor 
     142                                                .getInt(Message.COL_ID), msgCursor 
     143                                                .getString(Message.COL_MESSAGE), msgDate, mMonitorHash 
     144                                                .get(Integer.valueOf(msgCursor 
     145                                                                .getInt(Message.COL_MONITOR))), recvDate); 
    138146                                msgCursor.close(); 
    139147                                return newMessage; 
     
    144152        } 
    145153 
    146         public static synchronized Message[] GetMessages(Context context, int[] messages) { 
     154        public static synchronized Message[] GetMessages(Context context, 
     155                        int[] messages) { 
    147156                if (mMonitorHash == null) { 
    148157                        updateMonitorHash(context); 
     
    159168                whereclause += ")"; 
    160169 
    161                 Cursor msgCursor = context.getContentResolver().query(getMessageUri, null, whereclause, null, "time DESC"); 
     170                Cursor msgCursor = context.getContentResolver().query(getMessageUri, 
     171                                null, whereclause, null, "time DESC"); 
    162172                int retlen = msgCursor.getCount(); 
    163173                Message[] ret = new Message[retlen]; 
     
    168178                                String datestring = msgCursor.getString(Message.COL_TIME); 
    169179                                Date msgDate = Message.SQLDateFormatter.parse(datestring); 
    170                                  
    171                                 String recvstring = msgCursor.getString(Message.COL_RECEIVE_TIME); 
    172                                 Date recvDate = msgDate;        //for old entries, should we set it to null or just copy it? 
    173  
    174                                 if(recvstring == null || recvstring == "") { 
     180 
     181                                String recvstring = msgCursor 
     182                                                .getString(Message.COL_RECEIVE_TIME); 
     183                                Date recvDate = msgDate; // for old entries, should we set it to 
     184                                                                                        // null or just copy it? 
     185 
     186                                if (recvstring == null || recvstring == "") { 
    175187                                        recvDate = Message.SQLDateFormatter.parse(datestring); 
    176188                                } 
    177                                  
    178                                 Message newMessage = new Message( 
    179                                                                                                         msgCursor.getInt(Message.COL_ID), 
    180                                                                                                         msgCursor.getString(Message.COL_MESSAGE), 
    181                                                                                                         msgDate, 
    182                                                                                                         mMonitorHash.get(Integer.valueOf(msgCursor.getInt(Message.COL_MONITOR))), 
    183                                                                                                         recvDate 
    184                                                                                                         ); 
     189 
     190                                Message newMessage = new Message(msgCursor 
     191                                                .getInt(Message.COL_ID), msgCursor 
     192                                                .getString(Message.COL_MESSAGE), msgDate, mMonitorHash 
     193                                                .get(Integer.valueOf(msgCursor 
     194                                                                .getInt(Message.COL_MONITOR))), recvDate); 
    185195                                ret[i] = newMessage; 
    186196                        } catch (Exception ex) { 
  • trunk/rapidandroid/org.rapidandroid/src/org/rapidandroid/data/SmsDbHelper.java

    r122 r129  
    8383                                + "\"monitor_id\" integer NULL REFERENCES \"rapidandroid_monitor\" (\"id\")," 
    8484                                + "\"time\" datetime NOT NULL," + "\"message\" varchar(160) NOT NULL," 
    85                                 + "\"is_outgoing\" bool NOT NULL," + "\"is_virtual\" bool NOT NULL);"; 
     85                                + "\"is_outgoing\" bool NOT NULL," + "\"is_virtual\" bool NOT NULL," 
     86                                + "\"receive_time\" datetime NULL);"; 
    8687 
    8788                String mCreateTable_Monitor = "CREATE TABLE \"rapidandroid_monitor\" (" 
  • trunk/rapidandroid/org.rapidandroid/src/org/rapidandroid/receiver/SmsParseReceiver.java

    r120 r129  
    6565                } 
    6666                if (prefixes == null) { 
    67                         initLists(); 
     67                        initLists();    //profiler shows us that this is being called frequently on new messages. 
    6868                } 
    6969                // TODO Auto-generated method stub 
  • trunk/rapidandroid/org.rapidandroid/src/org/rapidandroid/receiver/SmsReceiver.java

    r128 r129  
    6666 
    6767                messageValues.put(RapidSmsDBConstants.Message.MONITOR, monitor.getID()); 
    68                 messageValues.put(RapidSmsDBConstants.Message.TIME, Message.SQLDateFormatter.format(ts)); 
     68                messageValues.put(RapidSmsDBConstants.Message.TIME, Message.SQLDateFormatter.format(ts));       //expensive string formatting operation. 
     69                //messageValues.put(RapidSmsDBConstants.Message.TIME, mesg.getTimestampMillis());       //longs don't store as datetimes 
    6970                messageValues.put(RapidSmsDBConstants.Message.IS_OUTGOING, false); 
    7071                Date now = new Date(); 
    71                 messageValues.put(RapidSmsDBConstants.Message.RECEIVE_TIME, Message.SQLDateFormatter.format(now)); 
     72                messageValues.put(RapidSmsDBConstants.Message.RECEIVE_TIME, Message.SQLDateFormatter.format(now));              //profile has shown this  is an expensive operation 
     73                //messageValues.put(RapidSmsDBConstants.Message.RECEIVE_TIME, now.getTime());   //but this doesn't fracking work to convert to a datetime value. 
    7274                boolean successfulSave = false; 
    7375                Uri msgUri = null; 
  • trunk/rapidjava/org.rapidsms.java/src/org/rapidsms/java/core/Constants.java

    r93 r129  
    11package org.rapidsms.java.core; 
    22 
     3import java.util.Calendar; 
    34import java.util.Date; 
    45import java.util.GregorianCalendar; 
     
    1112public class Constants { 
    1213        public static final Date NULLDATE = new GregorianCalendar(1900,1,1,5,0).getTime(); 
     14        public static final Calendar NULLCALENDAR = new GregorianCalendar(1900,1,1,5,0); 
    1315}