Что происходит с потоком Android после уничтожения созданного им действия? - PullRequest
17 голосов
/ 02 июня 2011

В моем приложении для Android основное действие иногда запускает поток для загрузки данных с сервера.Этот поток изменяет базу данных приложения и редактирует некоторые важные файлы.AFAIK, похоже, что этот поток продолжает выполняться.Что будет с этим потоком, если Android окажется в ситуации нехватки памяти и решит уничтожить все приложение?Будет ли когда-нибудь ситуация, когда эта нить может умереть преждевременно?Если да, то могу ли я узнать, что поток уничтожен, и что-то с этим сделать?

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

Ответы [ 4 ]

16 голосов
/ 02 июня 2011

AFAIK, может показаться, что этот поток продолжает выполняться.

Это правда, но у вас нет гарантии того, как долго нить останется в живых.

Что будет с этим потоком, если Android окажется в ситуации нехватки памяти и решит уничтожить все приложение?

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

Будет ли когда-нибудь ситуация, когда эта нить может преждевременно умереть?

Да

Если так, могу ли я как-нибудь увидеть, что нить убита, и что-то с этим сделать?

нет

Нет

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

То, что вы описываете, может быть классифицировано как нечто «критическое для миссии». Как указывалось в двух других ответах, Служба была бы более надежным способом ведения дел, поскольку Служба - это одна из последних вещей, которая будет «убита» в ситуации нехватки памяти. Использование START_REDELIVER_INTENT может помочь возобновить то, что он делал.

В любом случае, если у вас есть «критически важная» операция, вам необходимо спроектировать свой код для полного восстановления, такого как использование транзакций и возможность отката в случае ошибок.

5 голосов
/ 02 июня 2011

Вы должны использовать службу:

Поскольку процесс, выполняющий службу, имеет более высокий рейтинг, чем процесс с фоновыми действиями, действие, которое инициирует длительную операцию, может быть полезным для запускасервис для этой операции, а не просто для создания рабочего потока, особенно если операция, скорее всего, переживет действие.

Посмотрите здесь: http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html#Lifecycle (откуда вставлен текст, который я вставил)

5 голосов
/ 02 июня 2011

Похоже, вы должны перенести обновление базы данных в Сервис. После того, как действие переходит в фоновый режим, Android предполагает, что его процесс может быть прерван в случае необходимости и перезапущен позже без вредного воздействия. См. Основы применения для получения дополнительной информации.

4 голосов
/ 12 октября 2011

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

Каждый раз, когда вы используете базу данных и изменяете несколько строк, вы должны использовать транзакции, чтобы гарантировать, что данные остаются действительными в случае любого вида сбоя (который может быть, например, завершением потока, сокета). исключение и т. д.).

    try{
        db.beginTransaction(); 

        //Do whatever you need to do...    

        db.setTransactionSuccessful();
    }catch(SQLiteException e){
        Log.e("SQLite","Error while updating rows: " + e.getMessage());
    }finally{
        db.endTransaction(); //Commit (if everything ok) or rollback (if any error occured). 
        db.close(); //Close databse;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...