(Android) Nadmierna ilość zdarzeń w trakcie uruchamiania aplikacji

1

Witajcie.

Tworzę aplikację dla platformy Android przy pomocy środowiska Android Studio 2.1.2.
Ponieważ aplikacja się rozrosła to skutkiem tego jej czas uruchamiania się zwiększył(sporo się dzieje w onCreate).
Z ciekawości oprogramowałem również zdarzenia(dodałem im tylko Log.d) onStart, onRestar, onPostCreate, onResumeonPause i onDestroy.
Przeanalizowałem, które zdarzenia kiedy są wywoływane(w kontekście klawiszy "home", "back" i "task manager").

Skutkiem tego było moje zdziwienie gdy zobaczyłem co się dzieje podczas uruchamiania aplikacji.
Moje pytanie brzmi - dlaczego część zdarzeń wykonuje się dwukrotnie?
Aplikacja ma jedno Active, jedną klasę, nie ma wątków, kreuje tylko sporo klawiszy z obrazkami i kilka większych bitmap.
Nie mam pomysłu dlaczego aplikacja w trakcie uruchamiania "odpala" mi zdarzenia onResume(to jeszcze bym zrozumiał), onPause, oraz całkiem nie mam pomysłu dlaczego uruchamia onDestroy - aby następnie ponownie wykonać onCreate itd.

Poniższe zachowanie jest identyczne na dwóch różnych wersja Android'a i na różnych urządzeniach.

Oto kopia z monitoringu
08-13 1654.223 7247-7247/...................... D/DEBUG2: MainActivity.onCreate
08-13 1654.751 7247-7247/...................... D/DEBUG2: MainActivity.onStart
08-13 1654.751 7247-7247/...................... D/DEBUG2: MainActivity.onPostCreate
08-13 1654.751 7247-7247/...................... D/DEBUG2: MainActivity.onResume
08-13 1654.797 7247-7247/...................... D/DEBUG2: MainActivity.onPause
08-13 1654.797 7247-7247/...................... D/DEBUG2: MainActivity.onDestroy
08-13 1654.811 7247-7247/...................... D/DEBUG2: MainActivity.onCreate
08-13 1654.986 7247-7247/...................... D/DEBUG2: MainActivity.onStart
08-13 1654.986 7247-7247/...................... D/DEBUG2: MainActivity.onPostCreate
08-13 1654.987 7247-7247/...................... D/DEBUG2: MainActivity.onResume

Domyślam się, że jest to jedna z przyczyn długiego uruchamiania bo bez sensu dwa razy kreuje obiekty.
Niemniej oczywiście błędów nie ma. Ale pamięć RAM pożera strasznie.

0

Tymczasowo, dodałem zmienną, którą badam na początku onCreate i wracam jeśli trzeba.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        if (FirstStart) return;
        FirstStart = true;

Jeśli ktoś wie lub podejrzewa co może być przyczyną tego problemu to proszę o informację.

0

Nie możemy wróżyć z fusów. Ani nie pokazałeś MainActivity, ani nie pokazałeś Manifestu.

0
Arkady_pl napisał(a):

Tymczasowo, dodałem zmienną, którą badam na początku onCreate i wracam jeśli trzeba.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        if (FirstStart) return;
        FirstStart = true;

Jeśli ktoś wie lub podejrzewa co może być przyczyną tego problemu to proszę o informację.

Ifologia nie jest żadnym rozwiązaniem. Tak jak Panryz, wrzuć niezbędne informacje.

0

onCreate ma ponad 200 linii kodu i chyba nie ma co analizować - nadawanie wartości zmiennych, tworzenie obiektów, itd.
A manifest poniżej.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="eu.etmx.artpainterpro">

    <uses-feature
        android:name="android.hardware.camera"
        android:required="true" />

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".splash"
            android:theme="@style/AppTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MainActivity">
        </activity>
    </application>

</manifest>

Splash'a dodałem teraz i nie wpłynął on na podwójne uruchamianie.
Wtedy manifest wyglądał tak:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="eu.etmx.artpainterpro">

    <uses-feature
        android:name="android.hardware.camera"
        android:required="true" />

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:theme="@style/AppTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

W logach też jest zero wiadomości.
Tak jakby apka startowała, a następnie zamykała się i startowała ponownie.

W kodzie dodałem static int sysCount =0;
i powiększam ją o 1 na początku wywołania onCreate.
I wartość zmiennej się zwiększa.
Ewidentnie apka nie zamyka się całkowicie tylko "COŚ" wywołuje mi metody dwukrotnie.

(?)Moje pytanie to nie prośba o analizę kodu ale raczej prośba o jakieś sugestie, co może potencjalnie generować takie efekty.
Pomijam źle napisany kod, który sam generuje takie efekty.
Może to jakaś konfiguracja urządzenia albo kompilatora, a może to środowisko Andtroid Studio "tak ma".

Pozdrawiam.

0

Obecnie sytuacja się "skomplikowała".
Ten sam soft na Tablecie z Android 4.1 wywołuje jednokrotnie metody, natomiast z Android 5.1 wywołuje dwukrotnie.

0

Zatem uprościłem wszystko aby tylko apka się uruchomiła(oczywiście wiele nie działa ale interfejs startuje bez błędu).
Manifest już podałem wcześniej.
Obecnie onCreate wygląda tak:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        Log.d("DEB2", "onCreate("+(sysCount++)+")");
    }

natomiast obsługa wywołań została okrojona i wygląda tak:
(FirstStart jest ustawione na true;)

    @Override
    public void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        Log.d("DEB2", "onPostCreate");
        if (FirstStart) return;
    }


    @Override
    public void onPostResume() {
        super.onPostResume();
        Log.d("DEB2", "onPostResume");
        if (FirstStart) return;
   }

pozostałe zdarzenia wyglądają analogicznie.
Zatem z fusów nic nie zostało bo apka jest "pusta".

A mimo to, nadal mam takie wpisy jak poniżej(zwracam uwagę na () za onCreate:

08-16 20:14:25.131 15448-15448/eu.etmx.artpainterpro D/DEB2: onCreate(0)
08-16 20:14:25.146 15448-15448/eu.etmx.artpainterpro D/DEB2: onStart
08-16 20:14:25.146 15448-15448/eu.etmx.artpainterpro D/DEB2: onPostCreate
08-16 20:14:25.146 15448-15448/eu.etmx.artpainterpro D/DEB2: onPostResume
08-16 20:14:25.243 15448-15448/eu.etmx.artpainterpro D/DEB2: onPause
08-16 20:14:25.245 15448-15448/eu.etmx.artpainterpro D/DEB2: onStop
08-16 20:14:25.245 15448-15448/eu.etmx.artpainterpro D/DEB2: onDestroy
08-16 20:14:25.333 15448-15448/eu.etmx.artpainterpro D/DEB2: onCreate(1)
08-16 20:14:25.335 15448-15448/eu.etmx.artpainterpro D/DEB2: onStart
08-16 20:14:25.335 15448-15448/eu.etmx.artpainterpro D/DEB2: onPostCreate
08-16 20:14:25.335 15448-15448/eu.etmx.artpainterpro D/DEB2: onPostResume

Zatem, co dalej?

1

Zmiana orientacji activity resetuje je.

0
GThoro napisał(a):

Zmiana orientacji activity resetuje je.

Potwierdzam. Pomogło.

08-16 20:29:57.636 18390-18390/eu.etmx.artpainterpro D/DEB2: onCreate(0)
08-16 20:29:57.637 18390-18390/eu.etmx.artpainterpro D/DEB2: onStart
08-16 20:29:57.637 18390-18390/eu.etmx.artpainterpro D/DEB2: onPostCreate
08-16 20:29:57.638 18390-18390/eu.etmx.artpainterpro D/DEB2: onPostResume

Pozostaje pytanie jak mogę wymusić orientację nie w onCreate.
Manifest?

0

Serdeczne podziękowania za pomoc!

1 użytkowników online, w tym zalogowanych: 0, gości: 1