Падение GPS сервиса в произвольный момент времени

Ответить
Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Падение GPS сервиса в произвольный момент времени

Сообщение Mikhail_dev » 09 фев 2012, 09:45

Здравствуйте! Пишу программу, которая использует сервис, шлет GPS данные на сервер и получает ответ от него. Всё вроде бы ничего, работает. Но через несколько минут приложение падает. И природу этому явлению никак не найду.
Код Activity

Код: Выделить всё

public class GPSSampleActivity extends Activity implements OnClickListener {
	
	private LocationManager myManager;
	private Button btnOn;
	private Button btnOff;
	private Button btnLog;
	private TextView tvLog;
	private TextView tvServiceStatus;
	private Location falseLocation;
	private File fileName=null;
	
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		btnOn = (Button) findViewById(R.id.btnOn);
		btnOn.setOnClickListener(this);
		btnOff = (Button) findViewById(R.id.btnOff);
		btnOff.setOnClickListener(this);
		btnLog = (Button) findViewById(R.id.btnLog);
		btnLog.setOnClickListener(this);
		tvLog = (TextView) findViewById(R.id.tvLog);
		tvServiceStatus = (TextView) findViewById(R.id.tvServiceStatus);
		createLogFile();
	}
	
	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.btnOn:
			startService(new Intent(GPSSampleActivity.this,GPSService.class));
			tvServiceStatus.setText("Сервис запущен");
			break;
		case R.id.btnOff:
			stopService(new Intent(GPSSampleActivity.this,GPSService.class));
			tvServiceStatus.setText("Сервис остановлен");
			break;
		case R.id.btnLog:
			try {
				readLog();
			} catch (IOException e) {
				e.printStackTrace();
			}
			break;	
		} 
	}
	
	public void onStop() {
		super.onStop();
		stopService(new Intent(GPSSampleActivity.this,GPSService.class));
		tvServiceStatus.setText("Сервис остановлен");
	}
	
	public void onDestroy() { 
		super.onDestroy();
		stopService(new Intent(GPSSampleActivity.this,GPSService.class));
		tvServiceStatus.setText("Сервис остановлен");
	}
...
}
Код сервиса

Код: Выделить всё

public class GPSService extends Service implements LocationListener {
	private LocationManager locationManager;
	private final int TIME_OUT_SEC = 10;
	private File fileName=null;
	
	@Override
	public IBinder onBind(Intent arg0) {
		return null;
	}

	@Override
	public void onCreate() {
		super.onCreate();
		Toast.makeText(this,"Сервис запущен.", Toast.LENGTH_LONG).show();
		locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
		locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 1, this);
	}

	@Override
	public void onDestroy() {
		Toast.makeText(this, "Сервис остановлен.", Toast.LENGTH_LONG).show();
		locationManager.removeUpdates(this); 
		super.onDestroy();
	}

	@Override
	public void onLocationChanged(Location location) {
		if (location!=null) {
			try {
				postData(location);
			} catch (FileNotFoundException e) {
				writeData("   <FileNotFoundException in onLocationChanged()! "+"("+ e.getMessage()+ ") at "+ java.util.Calendar.getInstance ().getTime()+"/>");
				e.printStackTrace();
			} catch (IOException e) {
				writeData("   <IOException in onLocationChanged()! "+"("+ e.getMessage()+ ") at "+ java.util.Calendar.getInstance ().getTime()+"/>");
				e.printStackTrace();
			}
		}
	}
	
	public void postData(Location location) throws IOException  {
		HttpClient httpclient = new DefaultHttpClient();
		HttpPost httppost = new HttpPost("http://example.ru/location/");
		final HttpParams httpParameters = httpclient.getParams();
		HttpConnectionParams.setConnectionTimeout(httpParameters, TIME_OUT_SEC * 1000);
		HttpConnectionParams.setSoTimeout(httpParameters, TIME_OUT_SEC * 1000);
		try {
			httppost.setEntity(new UrlEncodedFormEntity(getPostData(location)));
			HttpResponse response = httpclient.execute(httppost);
			String sb = String.valueOf(response.getStatusLine().getStatusCode());
			writeData("   <Code from server="+sb.toString()+ " "+ java.util.Calendar.getInstance ().getTime()+"/>");
		} catch (ClientProtocolException e) {
			writeData("   <ClientProtocolException in postData()! "+"("+ e.getMessage()+ ") at "+ java.util.Calendar.getInstance ().getTime()+"/>");
			e.printStackTrace();
		} catch (IOException e) {
			writeData("   <IOException in postData()! "+"("+ e.getMessage()+ ") at "+ java.util.Calendar.getInstance ().getTime()+"/>");
			e.printStackTrace();			
		}
	}

		private List<NameValuePair> getPostData(Location location) { 
		List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
		nameValuePairs.add(new BasicNameValuePair("latitude", String.valueOf(location.getLatitude())));
		nameValuePairs.add(new BasicNameValuePair("longitude", String.valueOf(location.getLongitude())));
		nameValuePairs.add(new BasicNameValuePair("speed", String.valueOf(location.getSpeed())));
		return nameValuePairs; 
	}
	
	private void writeData(String sData) { 
		fileName = null;
		File directory = null;
		String sdState = android.os.Environment.getExternalStorageState();
		if (sdState.equals(android.os.Environment.MEDIA_MOUNTED)) {
				File sdDir = android.os.Environment.getExternalStorageDirectory();
				directory = new File(sdDir, "cache");
		} else {
				directory = this.getCacheDir();
		}
		if (!directory.exists()) directory.mkdirs();
		fileName = new File(directory, "GpsDataLog.txt");
		try {
			FileWriter f = new FileWriter(fileName, true);
			f.write("\n"+sData+"\n");
			f.flush();
			f.close();
		} catch (Exception e) {
			Toast.makeText(this, "Не удалось произвести запись в лог!", Toast.LENGTH_LONG).show();
			Log.d("myLogs", fileName.toString() + " ошибка создания лога = " + e.getMessage());
		}
	}
	
	@Override
	public void onProviderDisabled(String arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onProviderEnabled(String arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
	}
}
Файл с логом создается в главном Activity и вполне исправно работает. Тут у меня возникает 3 вопроса
1. Что я не так делаю, что программа падает в произвольный момент времени?
2. Как сделать логгирование данных при падении приложения, когда программа падает на реальном устройстве? В эмуляторе понятно, там на консоль выводится лог. А вот с реальным устройством никак не могу понять как узнать из-за чего приложение упало.
3. Как при падении приложения убивать сервис, чтобы он не оставался в системе работать?

Заранее спасибо.


Ответить