0

我在下面的代码中每分钟获取位置。实际上根据要求每分钟获取位置并通过套接字将其发送到服务器。

下面是我的代码,它每分钟都会错过服务器上的位置更新,我不知道背后的原因。请建议。

private static final int PERIOD=60000;

private void initLocationTracker()
{    
    try{
        mgr=(AlarmManager)getSystemService(ALARM_SERVICE);
        Intent i=new Intent(this, LocationPoller.class);
        i.putExtra(LocationPoller.EXTRA_INTENT, new Intent(this, LocationReceiver.class));
        i.putExtra(LocationPoller.EXTRA_PROVIDER, LocationManager.GPS_PROVIDER);
        pi=PendingIntent.getBroadcast(this, 0, i, 0);
        mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), PERIOD, pi);
    }
    catch (Exception e)
    {
        String s = e.getMessage();
    }
}

下面是我的广播接收器和套接字的代码

public class LocationReceiver extends BroadcastReceiver {

    private  String _serverAddress;
    private String _addressType;
    private int _port;
    private long _driverId;
    private Location _location;
    private String _message;
    //private Context _context;

    @Override
    public void onReceive(Context context, Intent intent) {
        File log= new File(Environment.getExternalStorageDirectory(), "LocationLog.txt");

        try {
            Bundle b=intent.getExtras();
            Location loc=(Location)b.get(LocationPoller.EXTRA_LOCATION);
            String msg;

            if (loc==null) {
                loc=(Location)b.get(LocationPoller.EXTRA_LASTKNOWN);

                if (loc==null) {
                    msg=intent.getStringExtra(LocationPoller.EXTRA_ERROR);
                }
                else {
                    msg="TIMEOUT, lastKnown="+loc.toString();
                }
            }
            else {
                msg=loc.toString();
                _location=loc;
                getServerAddress(context);
                createMessage();
                if(!CommonRoutines.isNetworkAvailable(context))
                {
                    return;
                }
                SocketManager socketManager = new SocketManager();
                socketManager.execute();
            }

            if (msg==null) {
                msg="Invalid broadcast received!";
            }
        }
        catch (Exception e) {
            Log.e(getClass().getName(), "Exception appending to log file", e);
        }
    }

    private boolean postLocation()
    {
        boolean result = false;
        InetAddress inetAddress=null;
        Socket socket=null;
        DataOutputStream outputStream = null;
        try
        {
            inetAddress = InetAddress.getByName(X.X.X.X);
            socket = new Socket(inetAddress,XXXX);
            outputStream= new DataOutputStream(socket.getOutputStream());
            outputStream.write(_message.getBytes());
            socket.close();
        }
        catch (UnknownHostException e)
        {
                String s = e.getMessage();
        }
        catch (IOException e)
        {
            String s = e.getMessage();
        }
        finally
        {
           if(socket!=null){
               try
               {
                 socket.close();
               }
               catch (IOException e){}
           }

           if(outputStream!=null)
           {
               try {
                    outputStream.close();
               }
               catch (IOException e){}

           }
        }
        return  result;
    }

    private void createMessage()
    {
        try{
            JsonGeoLocation geoLocation = new JsonGeoLocation();
            JsonGeoPosition geoPostion = new JsonGeoPosition();
            _message="";

            Time now = new Time();
            now.setToNow();

            geoLocation.setDriverId(_driverId);
            geoLocation.setLocationDateTime(DateFormat.getDateTimeInstance().format(new Date()));
            geoPostion.setLatitude(_location.getLatitude());
            geoPostion.setLongitude(_location.getLongitude());
            geoLocation.setGeoPosition(geoPostion);

            Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
            _message = gson.toJson(geoLocation)+"-EOM-";
        }
        catch (Exception e){
            String s = e.getMessage();
        }
    }

    public class SocketManager extends AsyncTask<Void,Integer,Void>
    {
        @Override
        protected Void doInBackground(Void... voids) {
            postLocation();
            return null;
            //return null;  //To change body of implemented methods use File | Settings | File Templates.
        }
    }
}

下面是示例日志

2012-10-23 00:00:48.0135 . Connection request initiated... 2012-10-23 00:00:48.0135 . Connection request accepted... 2012-10-23 00:00:48.0135 . Connection Id: 28383573 2012-10-23 00:00:48.3171 . Entered into OnDataIn ConnectionId: 28383573 2012-10-23 00:00:48.3176 . Data received:    {"F0":7,"F2":{"F0":51.57605743408203,"F1":0.09495019912719727},"F1":"Oct 23, 2012 12:00:48 AM"}-EOM- 2012-10-23 00:00:48.3176 . Received: JobId: 7 DateTime: 23/10/2012 00:00:48   Latitude:
51.576057434082 Longitude: 0.0949501991271973 2012-10-23 00:00:48.3966 . Connection disconnected... 2012-10-23 00:57:57.9396 . 
2012-10-23 00:57:57.9396 . Connection request initiated... 2012-10-23 00:57:57.9396 . Connection request accepted... 2012-10-23 00:57:57.9396 . Connection Id: 17817267 2012-10-23 00:57:58.2641 . Entered into OnDataIn ConnectionId: 17817267 2012-10-23 00:57:58.2646 . Data received:    {"F0":7,"F2":{"F0":51.57625961303711,"F1":0.09462833404541016},"F1":"Oct 23, 2012 12:58:01 AM"}-EOM- 2012-10-23 00:57:58.2646 . Received: JobId: 7 DateTime: 23/10/2012 00:58:01   Latitude:
51.5762596130371    Longitude: 0.0946283340454102 2012-10-23 00:57:58.3396 . Connection disconnected... 2012-10-23 00:58:55.4589 .
4

0 回答 0