Bird
Raised Fist0
Android Kotlinmobile~5 mins

Why ViewModel survives configuration changes in Android Kotlin

Choose your learning style10 modes available
Introduction

A ViewModel keeps your app data safe when the screen changes, like rotating your phone. It helps avoid losing information and keeps the app smooth.

When you want to keep user data safe during screen rotation.
When your app fetches data from the internet and you don't want to reload it after a configuration change.
When you want to keep UI state like scroll position or form inputs during device rotation.
When you want to separate UI code from data handling for cleaner code.
When you want to avoid restarting long tasks like downloads or calculations on screen changes.
Syntax
Android Kotlin
class MyViewModel : ViewModel() {
    // Your data and logic here
}

// In your Activity or Fragment
val viewModel = ViewModelProvider(this).get(MyViewModel::class.java)

The ViewModel class is part of Android Jetpack libraries.

Use ViewModelProvider to get the ViewModel instance tied to the UI controller lifecycle.

Examples
A simple ViewModel holding a count number.
Android Kotlin
class CounterViewModel : ViewModel() {
    var count = 0
}
Accessing and updating the count in the ViewModel from an Activity or Fragment.
Android Kotlin
val viewModel = ViewModelProvider(this).get(CounterViewModel::class.java)
viewModel.count += 1
Sample App

This app shows a number and a button. When you tap the button, the number goes up. If you rotate the phone, the number stays the same because the ViewModel keeps the count safe.

Android Kotlin
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView

class CounterViewModel : ViewModel() {
    var count = 0
}

class MainActivity : AppCompatActivity() {
    private lateinit var viewModel: CounterViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        viewModel = ViewModelProvider(this).get(CounterViewModel::class.java)

        val textView = TextView(this).apply {
            text = "Count: ${viewModel.count}"
            textSize = 24f
            id = 1
        }

        val button = Button(this).apply {
            text = "Increase Count"
            setOnClickListener {
                viewModel.count += 1
                textView.text = "Count: ${viewModel.count}"
            }
        }

        val layout = android.widget.LinearLayout(this).apply {
            orientation = android.widget.LinearLayout.VERTICAL
            addView(textView)
            addView(button)
        }

        setContentView(layout)
    }
}
OutputSuccess
Important Notes

ViewModel objects survive configuration changes like screen rotation but are cleared when the Activity or Fragment is finished.

Do not store UI elements or Context in ViewModel to avoid memory leaks.

ViewModel helps keep your app fast and user-friendly by saving data across changes.

Summary

ViewModel keeps data safe during screen rotations and other configuration changes.

It separates UI code from data logic for cleaner apps.

Use ViewModelProvider to get your ViewModel instance tied to your UI lifecycle.

Practice

(1/5)
1. Why does a ViewModel survive configuration changes like screen rotations in Android?
easy
A. Because it is tied to the lifecycle of the activity or fragment and not recreated on configuration changes
B. Because it saves data to a file on disk automatically
C. Because it uses static variables to hold data
D. Because it runs in a separate background thread

Solution

  1. Step 1: Understand ViewModel lifecycle

    A ViewModel is designed to be tied to the lifecycle of an activity or fragment but survives configuration changes like rotations.
  2. Step 2: Why it survives configuration changes

    When a configuration change happens, the activity is destroyed and recreated, but the ViewModel instance is retained and reused.
  3. Final Answer:

    Because it is tied to the lifecycle of the activity or fragment and not recreated on configuration changes -> Option A
  4. Quick Check:

    ViewModel lifecycle = survives config changes [OK]
Hint: ViewModel survives because it outlives activity recreation [OK]
Common Mistakes:
  • Thinking ViewModel saves data to disk automatically
  • Confusing ViewModel with static variables
  • Assuming ViewModel runs on a background thread
2. Which of the following is the correct way to get a ViewModel instance in an Activity using Kotlin?
easy
A. val model = ViewModelProvider.get(this, MyViewModel::class.java)
B. val model = MyViewModel()
C. val model = ViewModelProvider(this).get(MyViewModel::class.java)
D. val model = ViewModel()

Solution

  1. Step 1: Identify correct ViewModelProvider usage

    The correct syntax to get a ViewModel instance is using ViewModelProvider with the activity or fragment as owner.
  2. Step 2: Check Kotlin syntax

    Using ViewModelProvider(this).get(MyViewModel::class.java) is the standard way to get the ViewModel instance.
  3. Final Answer:

    val model = ViewModelProvider(this).get(MyViewModel::class.java) -> Option C
  4. Quick Check:

    ViewModelProvider(this).get() = correct syntax [OK]
Hint: Use ViewModelProvider(this).get() to get ViewModel [OK]
Common Mistakes:
  • Instantiating ViewModel directly with constructor
  • Using incorrect ViewModelProvider syntax
  • Confusing ViewModel class with instance
3. Given this code snippet in an Activity, what will be the output after a screen rotation?
class MyViewModel : ViewModel() {
  var counter = 0
}

// In Activity
val model = ViewModelProvider(this).get(MyViewModel::class.java)
model.counter += 1
println(model.counter)
medium
A. 1 on first launch, then resets to 0 after rotation
B. 1 on first launch, then increments to 2 after rotation
C. Always prints 0
D. Throws an error on rotation

Solution

  1. Step 1: Understand ViewModel data retention

    The ViewModel instance survives configuration changes, so its data like counter is preserved.
  2. Step 2: Trace counter increment

    On first launch, counter is 0, incremented to 1 and printed. After rotation, the same ViewModel instance is used, counter is 1, incremented to 2 and printed.
  3. Final Answer:

    1 on first launch, then increments to 2 after rotation -> Option B
  4. Quick Check:

    ViewModel retains data = increments preserved [OK]
Hint: ViewModel keeps data, so counter increments across rotations [OK]
Common Mistakes:
  • Assuming ViewModel resets on rotation
  • Thinking counter always starts at 0
  • Expecting an error due to rotation
4. What is wrong with this code that tries to use ViewModel in an Activity?
class MyViewModel : ViewModel() {
  var data = "Hello"
}

// In Activity
val model = MyViewModel()
println(model.data)
medium
A. The println statement is incorrect
B. The data variable must be private
C. ViewModel cannot have variables
D. ViewModel should not be instantiated directly; use ViewModelProvider instead

Solution

  1. Step 1: Identify ViewModel instantiation error

    ViewModel must be obtained via ViewModelProvider to survive configuration changes, not created with constructor.
  2. Step 2: Explain consequence

    Direct instantiation means a new ViewModel is created every time, losing data on rotation.
  3. Final Answer:

    ViewModel should not be instantiated directly; use ViewModelProvider instead -> Option D
  4. Quick Check:

    Use ViewModelProvider, not constructor [OK]
Hint: Never instantiate ViewModel with constructor directly [OK]
Common Mistakes:
  • Creating ViewModel with constructor
  • Thinking private variables fix lifecycle issues
  • Blaming println for errors
5. You want to keep user input data safe during screen rotations in your app. Which approach best uses ViewModel to achieve this?
hard
A. Store user input in a ViewModel property and update it on every input change
B. Save user input in SharedPreferences and reload after rotation
C. Use static variables in the Activity to hold user input
D. Recreate the ViewModel on each rotation and reset user input

Solution

  1. Step 1: Identify best practice for preserving UI data

    ViewModel is designed to hold UI-related data that survives configuration changes like rotations.
  2. Step 2: Choose correct data handling method

    Storing user input in a ViewModel property and updating it on input changes keeps data safe and avoids unnecessary disk operations.
  3. Final Answer:

    Store user input in a ViewModel property and update it on every input change -> Option A
  4. Quick Check:

    ViewModel holds UI data safely across rotations [OK]
Hint: Keep UI data in ViewModel properties updated live [OK]
Common Mistakes:
  • Using SharedPreferences for temporary UI data
  • Using static variables which can cause leaks
  • Recreating ViewModel loses data
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard