Приложение аварийно завершает работу при первом запуске, а не во второй раз, когда выполняет тот же код - PullRequest
2 голосов
/ 20 января 2011

У меня странный сбой, который я не могу понять.

При первом запуске приложения я проверяю, существует ли /data/Message.xml.Если нет, я создаю один.Затем я перехожу на страницу, где я анализирую этот XML-файл, и он падает, потому что он не существует (поэтому он не создал его).Я посмотрел в каталог данных и действительно, он не создал его.

Затем я снова запускаю приложение, и оно выполняет тот же код, в то время как на этот раз оно создает файл XML.

Я не знаю, почему он не работает в первый раз, приложение ничего не меняет, пока не выйдет из строя в первый раз, а условия при запуске во второй раз будут такими же.

Это вещь для Android?


Более подробная информация:

Я проверяю, доступен ли файл:

File file = new File(Environment.getDataDirectory() + "/data/com.name.app/files/Message.xml");

if (file.exists () == false) {createFirstXML ();}

createFirstXML ():

public void createFirstXML() {

Файл newxmlfile = новый файл (Environment.getDataDirectory () + "/data/com.name.app/files/Message.xml");try {newxmlfile.createNewFile ();} catch (IOException e) {e.printStackTrace ();} FileOutputStream fileos = null;try {fileos = new FileOutputStream (newxmlfile);} catch (FileNotFoundException e) {e.printStackTrace ();} XmlSerializer serializer = android.util.Xml.newSerializer ();try {serializer.setOutput (fileos, "UTF-8");serializer.startDocument (null, Boolean.valueOf (true));serializer.setFeature ("http://xmlpull.org/v1/doc/features.html#indent-output", true);

serializer.startTag (null," Message ");

serializer.startTag (null," Service "); serializer.text ("Приложение "); serializer.endTag (null," Сервис ");

serializer.endTag (null," Message ");

serializer.endDocument (); serializer.flush ();fileos.close ();} catch (Exception e) {e.printStackTrace ();}}

Журнал:

java.io.IOException: No such file or directory
 bla
 bla
java.io.FileNotFoundException: /data/data/com.name.app/files/Message.xml (No such file or directory)
 bla
 bla
java.lang.IllegalArgumentException
 bla
 bla
java.io.FileNotFoundException: /data/data/com.name.app/files/Message.xml (No such file or directory)
 bla
 bla
java.io.FileNotFoundException: /data/data/com.name.app/files/Message.xml (No such file or directory)
 bla
 bla

При втором запуске приложения оно также может 'Не могу найти Message.xml (потому что он выполняет createFirstXML ();), но он не дает исключений ???

Я действительно не понимаю ..

1 Ответ

2 голосов
/ 20 января 2011

Прежде всего, getDataDirectory, вероятно, не то, что вы хотите. Он (в настоящее время) возвращает каталог верхнего уровня, в котором установлены пакеты, поэтому, когда вы добавляете к нему «/data/com.themobilecompany.sosinternational/files/Message.xml», вы получаете «/data/data/com.themobilecompany.sosinternational». /files/Message.xml». Смотрите информацию об исключении:

java.io.FileNotFoundException: /data/data/com.themobilecompany.sosinternational/files/Message.xml (No such file or directory)

Этот каталог не существует, поэтому вы получаете исключение и не можете открыть файл.

Лучше использовать getFilesDir(), который вернет местоположение личного файла для вашего приложения и, следовательно, будет совместим с будущими версиями Android, которые могут изменить макет файловой системы.

getFilesDir в настоящее время вернет "/data/com.themobilecompany.sosinternational/", поэтому попробуйте изменить

File newxmlfile = new File(Environment.getDataDirectory() + "/data/com.themobilecompany.sosinternational/files/Message.xml");

до

File newxmlfile = new File(Context.getFilesDirectory() + "/files/Message.xml");

Не забудьте создать каталог с файлами, если он еще не существует.

Запускаете ли вы этот код в своем onCreate или он вызывается вашим onCreate или чем-то подобным? Если это так, то обычный жизненный цикл активности будет означать, что ваш код не запускается при каждом запуске приложения. onCreate будет вызываться при создании вашей активности, чаще всего, когда вы «выходите» (то есть нажимаете кнопку «назад»), вы просто приостанавливаете свою деятельность. Когда вы перезапускаете его, Android просто повторно использует существующую приостановленную активность, поэтому ваш onCreate не будет вызываться для того, что, по-видимому, является последующим выполнением вашего приложения - поэтому не всегда возникает исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...