[JAVA] Verwenden Sie ViewModel, um Android-Apps grob zu drehen

Es ist schwierig zu überlegen, was zu tun ist, wenn die Aktivität zerstört wird, wenn Sie die Rotation ernsthaft unterstützen, aber wenn Sie die Rotation grob abgesehen von den Details behandeln möchten, ViewModel Es ist einfach mit / topic / bibliotheken / architektur / viewmodel zu tun.

wie kann ich?

Vor dem Drehen

Angenommen, Sie haben eine Aktivität, die die Anzahl der Umdrehungen in Toast bei jeder Umdrehung in der folgenden Form anzeigt.


public class MainActivity extends AppCompatActivity {

    //Ich möchte diesen Wert behalten, auch wenn ich ihn drehe
    int count = 0;

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

        count++;
        Toast.makeText(this, String.valueOf(count) + "Das zweite Mal! !!", Toast.LENGTH_SHORT).show();
    }
}

Wenn ich diesen Code ausführe, wird "Erstes Mal !!" angezeigt, egal wie oft er gedreht wird. Dies liegt daran, dass es jedes Mal, wenn es gedreht wird, von onCreate () neu startet und die Anzahl initialisiert wird.

Nach der Rotation

Wenn Sie von Google bereitgestellte Architektur-Compoennts einschließen, können Sie diese problemlos drehen.

Machen Sie app / build.gradle wie folgt:

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

Da sich die obige Bibliothek nur im Google-Repository befindet, müssen Sie wie folgt Änderungen an build.gradle im Projektstamm vornehmen.

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

Sie können jetzt Architekturkomponenten verwenden. Jetzt müssen Sie nur noch die Aktivität wie folgt ändern.


public class MainActivity extends AppCompatActivity {

    //Schieben Sie die Variable, die Sie behalten möchten, in das ↓ ViewModel!
    public static class MyModel extends ViewModel {
        int count = 0;
    }

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

        //Extrahieren Sie das oben definierte Modell aus ViewModelProviders
        //Der Wert vor der Drehung bleibt in dem hier herausgenommenen Modell korrekt erhalten.
        MyModel model = ViewModelProviders.of(this).get(MyModel.class);
        model.count++;
        Toast.makeText(this, String.valueOf(model.count) + "Das zweite Mal! !!", Toast.LENGTH_SHORT).show();
    }
}

Machen Sie die Variable, die Sie nach dem Drehen behalten möchten, zu einer Mitgliedsvariablen namens ViewModel und drehen Sie sie, indem Sie sie einfach aus ViewModelProvider herausziehen. Die Korrespondenz ist abgeschlossen. Einfach!

Natürlich kann Fragment genauso damit umgehen.

ViewModel gibt es auch entsprechend dem Lebenszyklus frei, sodass Sie sich keine Sorgen über Lecks machen müssen. Beachten Sie jedoch, dass beim Einfügen einer Ansicht oder eines Kontexts in ein ViewModel ein Leck auftritt.

Es ist zu beachten, dass die Aktivität möglicherweise zerstört wird, wenn sich die App im Hintergrund befindet und eine Weile stehen bleibt. In diesem Fall kehrt die Anzahl jedoch zum Anfangswert zurück (0 in diesem Code). Ich werde am Ende.

Wenn Sie es richtig unterstützen möchten, müssen Sie die Rotation mit saveInstanceState, Room usw. unterstützen.

Verweise

Recommended Posts

Verwenden Sie ViewModel, um Android-Apps grob zu drehen
Einfach zu bedienender Cloud Firestore (Android)
Konvertieren Sie alle Android-Apps (Java) in Kotlin
Verwendung von ExpandableListView in Android Studio
Verwendung von UsageStatsManager in Android Studio (Überprüfen der Startzeit anderer Apps)
Verwendung von Truth (Assertion Library für Java / Android)
[Android Studio] Ich möchte eine Maven-Bibliothek unter Android verwenden
[Hinweis] Herausforderung bei der Entwicklung einer kommerziellen Andorid-App
Wie benutzt man rbenv?
Verwendung mit_option
Verwendung von java.util.logging
Verwendung der Karte
Verwendung von collection_select
Lassen Sie uns den Pfad durchgehen, um Docker-Slim zu verwenden
Einführung in das Android-Layout
Wie benutzt man Twitter4J
Wie benutzt man active_hash! !!
Verwendung von MapStruct
Verwendung von TreeSet
[Verwendung des Etiketts]
Wie man Identität benutzt
Verwendung des Mali Graphics Debugger zum Debuggen von Apps für Android (auch von Apps, die mit + Unity erstellt wurden)
Wie man Hash benutzt
Verwendung von Dozer.mapper
Wie benutzt man Gradle?
Verwendung von org.immutables
Verwendung von java.util.stream.Collector
Verwendung von VisualVM
Verwendung von Map
So verwenden Sie OpenCV 4 unter Android und zeigen die Kamera live an
Verwenden Sie Java, das in Android Studio enthalten ist, um React Native zu erstellen
So entfernen Sie Android-Apps, die mit dem RenderThread-Rätselfehler abstürzen