2015-07-30 2 views
0

Как указано в документации относительно bound services, a mBound boolean используется для определения того, была ли служба связана с активностью. Вот выдержка из примера кода в документации:Уместно ли хранить флаг mBound при привязке услуги?

public class BindingActivity extends Activity { 
    LocalService mService; 
    boolean mBound = false; 

    private ServiceConnection mConnection = new ServiceConnection() { 
    public void onServiceConnected(ComponentName className, IBinder service) { 
     LocalBinder binder = (LocalBinder) service; 
     mService = binder.getService(); 
     mBound = true; 
    } 
} 

Почему использовать дополнительный элемент, а не установка mService к null, если оно не связано? Мне кажется излишним и потенциально error-prone.

+1

Это всего лишь образец реализации, вам нужно следовать принципам, а не деталям реализации. – pskink

+0

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

+0

в официальных служебных документах (http://developer.android.com/reference/android/app/Service.html), это еще лучше: см. 'Boolean mIsBound' и когда он установлен в' true' ... – pskink

ответ

1

Нет необходимости хранить дополнительный флаг в своей деятельности.

Дополнительный флаг добавляет риск на согласованность данных и атомарность, такие как:

  • непротиворечивость данных: Кто-то изменить этот код, можно спутать о том, следует mBound или mService != null быть использованы так же, как вы , Они могут беспокоиться об этом и добавить assert(mBound == mService != null); чек.

  • атомарность: В строгой потокобезопасных условиях, onServiceConnected только может быть заблокирован, прежде чем mBound = true;, в то время как в другом потоке, mService и mBound могут конфликтовать в состоянии.

  • сложность: Что делать, если кто-то еще редактировал код только что измененный mBound в другое состояние по ошибке?

Надеюсь, это могло бы помочь.