Мои действия и фрагменты, кажется, запускают методы дважды после изменения их launchMode
Недавно я изменил свой проект, чтобы я мог обрабатывать "Задачу входа в систему", которая состоит из одного действия, и "Основную задачу", которая включает в себя все другие действия. Я сделал это через Манифест:
<application
android:name=".MyApp"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name">
<activity
android:name=".ui.login.LoginActivity"
android:label="@string/app_name"
android:launchMode="singleTask"
android:taskAffinity="@string/affinity_login">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.main.MainActivity"
android:label="@string/title_activity_main"
android:taskAffinity="@string/affinity_main"
android:launchMode="singleTask"/>
<activity
android:name=".ui.tandc.TermsAndConditionsActivity"
android:parentActivityName=".ui.main.MainActivity" />
...
</application>
Теперь я начинаю видеть дублированные строки каждый раз, когда что-то регистрирую. Сначала я подумал, что есть два экземпляра каждого действия / фрагмента (не знаю, как, на самом деле), но это не тот случай, который можно увидеть в журнале this.toString()
по активам и фрагментам:
09-25 16:10:57.602/ D/LoginActivity: Activity onCreate() instance: com.mypackage.ui.login.LoginActivity@2a9a9e50
09-25 16:10:57.602/ D/LoginActivity: Activity onCreate() instance: com.mypackage.ui.login.LoginActivity@2a9a9e50
09-25 16:10:58.193/ D/LoginActivity: Activity onStart() instance: com.mypackage.ui.login.LoginActivity@2a9a9e50
09-25 16:10:58.193/ D/LoginActivity: Activity onStart() instance: com.mypackage.ui.login.LoginActivity@2a9a9e50
09-25 16:10:59.934/ D/MainActivity: Activity instance: com.mypackage.ui.main.MainActivity@3e7f641b
09-25 16:10:59.934/ D/MainActivity: Activity instance: com.mypackage.ui.main.MainActivity@3e7f641b
09-25 16:11:00.605/ D/WalletListFragment: newInstance()
09-25 16:11:00.605/ D/WalletListFragment: newInstance()
09-25 16:11:00.675/ D/ComprasListFragment: Fragment instance: ComprasListFragment{2cbeb452 #2 id=0x7f11079f android:switcher:2131822495:2}
09-25 16:11:00.685/ D/ComprasListFragment: Fragment instance: ComprasListFragment{2cbeb452 #2 id=0x7f11079f android:switcher:2131822495:2}
09-25 16:11:00.685/ D/ComprasListFragment: onCreate(savedInstanceState = new)
09-25 16:11:00.685/ D/ComprasListFragment: onCreate(savedInstanceState = new)
09-25 16:11:00.695/ D/RecargasFragment: Fragment onAttach() instance: RecargasFragment{318ff323 #3 id=0x7f11079f android:switcher:2131822495:3}
09-25 16:11:00.695/ D/RecargasFragment: Fragment onAttach() instance: RecargasFragment{318ff323 #3 id=0x7f11079f android:switcher:2131822495:3}
09-25 16:11:00.715/ D/RecargasFragment: Fragment onCreate() instance: RecargasFragment{318ff323 #3 id=0x7f11079f android:switcher:2131822495:3}
09-25 16:11:00.715/ D/RecargasFragment: Fragment onCreate() instance: RecargasFragment{318ff323 #3 id=0x7f11079f android:switcher:2131822495:3}
09-25 16:11:03.017/ D/StoresMapFragment: Fragment instance: StoresMapFragment{215cf0c5 #1 id=0x7f11079f android:switcher:2131822495:1}
09-25 16:11:03.017/ D/StoresMapFragment: Fragment instance: StoresMapFragment{215cf0c5 #1 id=0x7f11079f android:switcher:2131822495:1}
09-25 16:11:03.047/ D/RecargasFragment: Fragment onStart() instance: RecargasFragment{318ff323 #3 id=0x7f11079f android:switcher:2131822495:3}
09-25 16:11:03.047/ D/RecargasFragment: Fragment onStart() instance: RecargasFragment{318ff323 #3 id=0x7f11079f android:switcher:2131822495:3}
Когда я запускаю MainAcitivity
(где находится ViewPager
с четырьмя фрагментами) Я также занимаюсь установкой правильных (?) флагов:
protected void startMainActivity(String token) {
Intent i = new Intent(this, MainActivity.class);
i.putExtra(PARAM_1, token);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
finish();
}
Я не использую флаг при открытии всех других действий из Main, так как все они указывают MainActivity
как родитель, хотя я не думаю, что это связано.
Да, я прочитал и просмотрел официальную документацию, но до сих пор не могу понять, что происходит.
Что самое странное для меня, так это тот факт, что это приложение было построено с использованием MVP: каждое действие имеет свои собственные Presenter, View и Interactor, а последнее заботится только о получении данных с сервера. Я реализовал Retrofit для этого, и интеракторы не делают это дублирование, но докладчики также показывают дублированное ведение журнала.
В общем, у меня есть два вопроса:
- Почему я получаю двойные журналы?
- Правильно ли я выполняю задачи для того, чего хочу достичь? - Моя интуиция говорит мне, что мне также нужно указать
taskAffinity
так что все остальные действия могут быть на "главной задаче"
Кстати, я использую Timber и не сажаю дерево в каждом действии, а в своем классе приложений
Спасибо за любые возможные предложения.
1 ответ
Есть ли у вас библиотеки, в которых также сажают деревянные деревья? Мое приложение дублировало записи журнала при отладке, потому что одна из моих библиотек также использовала Timber.
Я добавил следующую дополнительную проверку в свой класс Application, чтобы предотвратить дублирование:
if (BuildConfig.DEBUG && Timber.treeCount() == 0)
Timber.plant(new Timber.DebugTree());
- Основываясь на ваших журналах, я предполагаю, что это все еще дублирование журналов. Отметки времени равны. Я хотел бы заменить журналирование Timber на простой Log.d и попробовать, если это поможет. Если так - копайте глубже, чтобы отследить, когда древесина дублирует бревна.
- На первый взгляд все правильно.