【问题标题】:Activity Reload every time每次活动重新加载
【发布时间】:2016-01-19 21:55:04
【问题描述】:

我有一个带有 ListView (ItemsActivity) 的 Activity,它的内容来自 JSON API。当我在 ListView 中按下一个项目时,它会加载另一个带有详细信息的 Activity (DetailActivity) 。问题是,当我按下返回按钮时,ItemsActivity 会重新加载 ListView。

我不知道在哪里可以找到有关此的更多信息。我来自 iOS,以前的屏幕不会每次都重新加载。

我想在活动之间保留 ListView 数据。我测试了从 onResume() 调用 loadListItems() 方法,但结果相同。

这是我的代码的简短示例。任何帮助和建议将不胜感激。

/* ItemsActivity.java */
public class ItemsActivity extends AppCompatActivity {
  private ListView listItemView;
  private Movie[] movies;
  private ProgressBar progressBar;

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

    listItemView = (ListView) findViewById(R.id.listItemView);
    progressBar = (ProgressBar) findViewById(R.id.progressBar);

    loadListItems();
  }

  private void loadListItems(){
    // Http call
    ...
    // Iterate JSON and saving to movies array
    ...
    progressBar.setVisibility(INVISIBLE);

    ListAdapter adapter = new ListAdapter(ItemsActivity.this, movies);
     listItemView.setAdapter(adapter);
  }

  /* Adapter Class */

  @Override
  public void onClick(View v) {
    Intent i = new Intent(this, DetailActivity.class);
    i.putExtra("item_id", 1);
    startActivity(i);
  }
}

我刚刚测试了一个包含 2 个活动的新项目,即 ActivityOne 和 ActivityTwo。 ActivityOne 有一个按钮,当按下它的加载 ActivityTwo 时,当我按下返回按钮时,在 ActivityOne 中再次调用 onCreate() 方法。

【问题讨论】:

  • 您可以尝试在 onCreate() 中输入一个日志,在 onResume() 中输入一个日志,看看它是否确实每次都被调用?
  • 你能发布你的第二个活动代码吗?我认为您重新开始 ActivityOne 而不是完成 ActivityTwo。因为从 ActivityTwo 回来时不应调用 onCreate()。

标签: android android-intent android-activity android-listview activity-lifecycle


【解决方案1】:

您提到“我测试过从 onResume() 调用 loadListItems() 方法,但结果相同。”这个 onResume() 代码是罪魁祸首。

只要您的活动再次获得焦点,就会调用 OnResume()。如果您在 onResume() 中调用 loadListItems() ,那么每次您从第二个活动返回到此活动时都会调用它。 http://developer.android.com/reference/android/app/Activity.html#onResume()

【讨论】:

  • 目前我只在 onCreate() 中调用 loadListItems() 而不是在 onResume() 中。
  • 我希望当您从 DetailActivity() 按下返回按钮时不会重新启动 ItemsActivity....
  • 我现在该怎么办? DetailActivity 没有任何与 ItemsActivity 相关的代码。
  • hmm...在这种情况下,请在 onCreate() 和 onResume() 中添加日志并检查。您还可以将 new exception().printStackTrace() 放入 loadListItems() 函数中,以便您现在知道它的 stackTrace 以及谁在调用它。这将有助于您解决回溯问题。
  • 我刚刚测试了一个包含 2 个活动的新项目,即 ActivityOne 和 ActivityTwo。 ActivityOne 有一个按钮,当按下它的加载 ActivityTwo 时,当我按下返回按钮时,在 ActivityOne 中再次调用 onCreate() 方法。
【解决方案2】:

解决方案是使用 StartActivityForResult 而不是 StartActivity。然后在第二个活动中,覆盖 onBackPressed 方法并完成()此方法中的第二个活动。在您的第一个活动中覆盖 onActivityResult 方法,将调用此活动而不是 onCreate 方法,并且不会重新加载 ListView。

【讨论】:

  • 错了!!!使用StartActivityForResult而不是StartActivity与Activity的生命周期无关。如果您正在等待来自第二个活动的回调,则使用 StartActivityForResult
【解决方案3】:

只有当我按下操作栏中的后退按钮并使用 onOptionsItemSelected 方法修复它时才会出现问题。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    if (id == android.R.id.home) {
        onBackPressed();
        return true;
    }

    return super.onOptionsItemSelected(item);
}

【讨论】:

    猜你喜欢
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 2021-11-13
    • 1970-01-01
    • 2013-12-06
    相关资源
    最近更新 更多