Что происходит с потоком Android после того, как действие, которое его создало, уничтожено?

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

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

Ответы

Ответ 1

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

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

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

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

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

Да

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

Нет

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

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

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

Ответ 2

Похоже, вы должны перенести обновление db на службу. Как только активность переходит на задний план, Android предполагает, что его процесс можно будет отключить, если необходимо, и перезапустить его позже, без какого-либо эффекта. Подробнее см. Основы приложений.

Ответ 3

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

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

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

Ответ 4

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

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

    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;
    }