[JAVA] Utilisez ViewModel pour faire pivoter approximativement les applications Android

Il est difficile de réfléchir à ce qu'il faut faire lorsque l'activité est détruite si elle prend sérieusement en charge la rotation, mais si vous voulez gérer la rotation à peu près en dehors des détails, ViewModel C'est facile à faire avec / topic / bibliothèques / architecture / viewmodel).

Comment puis-je faire?

Avant la rotation

Par exemple, supposons que vous ayez une activité qui affiche le nombre de rotations dans Toast à chaque fois qu'elle tourne sous la forme suivante.


public class MainActivity extends AppCompatActivity {

    //Je veux conserver cette valeur même si je la fais pivoter
    int count = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        count++;
        Toast.makeText(this, String.valueOf(count) + "La deuxième fois! !!", Toast.LENGTH_SHORT).show();
    }
}

Lorsque j'exécute ce code, "Première fois !!" s'affiche quel que soit le nombre de rotations. C'est parce que chaque fois qu'il est tourné, il recommence à partir de onCreate () et count est initialisé.

Après rotation

Si vous incluez des composants d'architecture fournis par Google, vous pouvez facilement les faire pivoter.

Faites app / build.gradle comme suit:

dependencies {
    ...
    compile 'android.arch.lifecycle:extensions:1.1.1'
    ...
}

Étant donné que la bibliothèque ci-dessus se trouve uniquement dans le référentiel Google, vous devez apporter des modifications à build.gradle à la racine du projet comme suit.

allprojects {
    repositories {
        jcenter()
        maven { url 'https://maven.google.com' }
    }
}

Vous pouvez désormais utiliser les composants d'architecture. Il ne vous reste plus qu'à modifier l'activité comme suit.


public class MainActivity extends AppCompatActivity {

    //Poussez la variable que vous souhaitez conserver dans le ↓ ViewModel!
    public static class MyModel extends ViewModel {
        int count = 0;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Extraire le modèle défini ci-dessus à partir de ViewModelProviders
        //La valeur avant rotation est correctement conservée dans le modèle pris ici.
        MyModel model = ViewModelProviders.of(this).get(MyModel.class);
        model.count++;
        Toast.makeText(this, String.valueOf(model.count) + "La deuxième fois! !!", Toast.LENGTH_SHORT).show();
    }
}

Faites de la variable que vous souhaitez conserver après la rotation une variable membre appelée ViewModel et faites-la pivoter simplement en la retirant de ViewModelProvider. La correspondance est terminée. Facile!

Bien sûr, Fragment peut le gérer de la même manière.

ViewModel le publie également en fonction du cycle de vie, vous n'avez donc pas à vous soucier des fuites. Cependant, sachez que si vous placez une vue ou un contexte dans un ViewModel, il fuit.

Il convient de noter que l'activité peut être détruite lorsque l'application est en arrière-plan et laissée pendant un certain temps, mais dans ce cas, le nombre revient à la valeur initiale (0 dans ce code). Je vais finir.

Si vous souhaitez le prendre en charge correctement, vous devez prendre en charge la rotation à l'aide de saveInstanceState, Room, etc.

Les références

Recommended Posts

Utilisez ViewModel pour faire pivoter approximativement les applications Android
Facile à utiliser Cloud Firestore (Android)
Convertir toutes les applications Android (Java) en Kotlin
Comment utiliser ExpandableListView dans Android Studio
Comment utiliser UsageStatsManager dans Android Studio (Comment vérifier l'heure de démarrage d'autres applications)
Comment utiliser Truth (bibliothèque d'assertions pour Java / Android)
[Android Studio] Je souhaite utiliser une bibliothèque Maven sur Android
[Note] Défi pour développer une application commerciale Andorid
Comment utiliser rbenv
Comment utiliser with_option
Comment utiliser java.util.logging
Comment utiliser la carte
Comment utiliser collection_select
Passons en revue le PATH pour utiliser docker-slim
Introduction à la mise en page Android
Comment utiliser Twitter4J
Comment utiliser active_hash! !!
Comment utiliser MapStruct
Comment utiliser TreeSet
[Comment utiliser l'étiquette]
Comment utiliser l'identité
Comment utiliser Mali Graphics Debugger pour déboguer des applications pour Android (même celles créées avec + Unity)
Comment utiliser le hachage
Comment utiliser Dozer.mapper
Comment utiliser Gradle
Comment utiliser org.immutables
Comment utiliser java.util.stream.Collector
Comment utiliser VisualVM
Comment utiliser Map
Comment utiliser OpenCV 4 sur Android et afficher la vue en direct de la caméra
Utilisez Java inclus avec Android Studio pour créer React Native
Comment se débarrasser des applications Android qui plantent avec l'erreur mystère RenderThread