10

我的启动器活动,即 MainActivity 在使用时被实例化了两次, AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) 这导致了两次网络调用并做出了奇怪的行为。

有什么可以控制它并只初始化一次吗?我试过使用 launchMode = "singleTop" 和 "singleInstance"

 override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
    mRequestQueue = Volley.newRequestQueue(this)
    Log.e(TAG,"Skillet")
    loadStateData()
    initializeListeners()
}
4

3 回答 3

14

在尝试了一些我的做法后找到了解决方案

override fun onCreate(savedInstanceState: Bundle?) {
    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    }

在 onCreate() 的 super 之前调用暗模式函数

它将防止两次实例化活动

于 2020-04-09T21:11:02.517 回答
4

在某些情况下(例如方向更改)会重新启动活动,这没有错。

除了阻止活动重新启动(这是其生命周期的一部分)之外,您可以做的另一件事是我鼓励您做的事情是使用ViewModel来处理此任务,因为它在推荐的应用程序架构中被推荐,这样当您的活动重新启动并要求其 ViewModel:

viewModel = ViewModelProviders.of(this).get(MainActivityViewModel::class.java)

它重用相同的 ViewModel 并且任务继续进行,就好像什么都没发生一样。

实际上,如果您想遵循该架构,则应在存储库中完成任务,但 ViewModel 应该负责它,并且在重新启动 Activity 时不会重新创建它。

我建议你为此做Android Kotlin Fundamentals 05.1 codelab

于 2020-04-09T19:04:36.107 回答
0

为那些使用“绑定”的人找到了解决方案

这很有趣但有效:

protected void onCreate(Bundle savedInstanceState) {

    sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);

    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);

    binding = ActivityMainBinding.inflate(getLayoutInflater());
    super.onCreate(savedInstanceState);
    setContentView(binding.getRoot());

    binding = ActivityMainBinding.inflate(getLayoutInflater());
    setContentView(binding.getRoot());
    } 
于 2022-03-04T09:13:44.120 回答