【问题标题】:why isn't my activity class's instance variable value being preserved onResume()?为什么我的活动类的实例变量值没有保留 onResume()?
【发布时间】:2014-08-19 01:31:12
【问题描述】:
  1. 我在活动 B 中有一个列表视图,该列表视图通过适配器填充了列表列表。这个列表列表是从 Activity A 传递的包中检索到的,如下所示:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_results);
    lvLineups = (ListView)findViewById(R.id.lvResults); 
    }
    
    @Override
    protected void onResume() {
    super.onResume();
    lineups = (ArrayList<ArrayList<Band>>) getIntent().getSerializableExtra("results");
    ResultsAdapter resultsAdapter = new ResultsAdapter(this, lineups);
    lvLineups.setAdapter(resultsAdapter);
    }
    
  2. 我从此 Activity 启动了一个隐式视频 Intent,因此 Activity B 进入后台(暂停,onPause 被调用)并且视频在前面。

  3. 我重新点击视频,终止了该活动。

  4. Activity B 的简历(调用了 onResume),我看到列表(阵容)现在是空的。 根据活动生命周期,这个活动正在恢复,为什么我仍然看不到第 1 步中的列表列表,以及在隐式视频意图后如何保留它。

注意:这看起来像一个垂直列表视图,其中每一行都是一个水平滚动的列表。除了添加视频意图时,我已经让这个布局工作了。播放视频并向下滚动会导致 indexoutofbounds 异常,因为从 Activity A 收到的捆绑包 lineups 现在已经消失了。

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

    lvLineups = (ListView)findViewById(R.id.lvResults);
    lineups = (ArrayList<ArrayList<Band>>) getIntent().getSerializableExtra("results");
    ResultsAdapter resultsAdapter = new ResultsAdapter(this, lineups);
    lvLineups.setAdapter(resultsAdapter);
}

媒体播放器播放视频并关闭后,返回活动 B,我在调试器中看到阵容为空。这很奇怪,因为在调用 onCreate 之前它是一个未初始化的实例变量。我希望它在从 Activity B 启动视频意图后保持不变,或者至少为空。

【问题讨论】:

  • 发布您将适配器设置为列表视图的代码。您正在从 A 获取数据。因此,您需要将它们存储在某个地方以便在B 中重复使用。
  • 您是否将这些值存储在onPause() of B 中?
  • onResume()onPause() 中,您可能根本不需要对您的适配器做任何事情,但是在您发布代码之前,这个建议是没有实际意义的。

标签: android


【解决方案1】:

好的,让我们来看看活动周期。

最初,您从 Activity A 启动了 Activity B => 因此,lineups 是从 Activity A 的捆绑包中获取的。因此您获得了该值。

然后您启动了Video,这是另一个意图。然后你要回去了。此时onResume() 再次被调用(其中捆绑包没有lineups 的值)。您应该在onCreate() 中获得lineups,而不是在暂停后调用的onResume()

【讨论】:

  • 我最初将 getSerializableExra 调用放在 onCreate 中,而不是在 Activity B 中的 onResume 中,结果相同;当视频结束并恢复活动时,阵容的价值就会丢失。我需要以某种方式保存它;我认为由于活动 B 在播放视频时处于后台,因此在返回时仍会保留该值。
  • 尝试从 onResume 中删除所有初始化阵容的东西并放置日志并检查是否调用 onCreate() 并记录列表的值
  • 删除了 onResume 并将该代码放入 onCreate。在播放视频之前,它会被调用一次。播放视频并控制返回到活动 B 后,我看到曾经完整的列表为空(大小为 0 但不为空)。
  • 您能否将您的最新代码发布为评论。包括您在哪里使用此列表
  • 感谢 viswanath,这是一个不同的愚蠢错误。
猜你喜欢
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多