我有一个ListActivity。它接收一个可分配的对象并将其保存为属性。
问题是当你按下ListView项目时,另一个Activity会出现:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
setHjClient((Client) getIntent().getParcelableExtra("hjClient"));
setListAdapter(new ComplejoListAdapter(this, getHjClient().getComplejos()));
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
//super.onListItemClick(l, v, position, id);
Complejo c = ((Complejo) l.getAdapter().getItem(position));
Intent i = new Intent(this, ComplejoActivity.class);
i.putExtra("session", getHjClient().getSession());
i.putExtra("complejo", c);
startActivity(i);
}
直到这里一切都按预期工作,但当我按下后退按钮时,再次调用OnCreate方法,但现在getIntent()为null所以我没有我需要填充ListView的可分配数据所以我收到NullPointerException错误。
按下按钮后,当Activity显示时,如何访问该parcelable数据?
编辑我的onCreate方法:
Client hjClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
if (getIntent().getExtras() != null) {
setHjClient((Client) getIntent().getParcelableExtra("hjClient"));
setListAdapter(new ComplejoListAdapter(this, getHjClient().getComplejos()));
} else if (savedInstanceState != null) {
setHjClient((Client) savedInstanceState.getParcelable("hjClient"));
setListAdapter(new ComplejoListAdapter(this, getHjClient().getComplejos()));
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putParcelable("hjClient", getHjClient());
super.onSaveInstanceState(outState);
}
答案 0 :(得分:1)
你的“活动”听起来像是被破坏了(可能是因为内存限制)。
这是一个“经典”案例,当Android表示您需要保留数据以防万一事件发生在您无法控制的情况下。最好的例子是当用户在您的应用程序中并且电话响铃时。他们离开你的应用程序,当他们返回时,你不应该期望保存“状态”。
您需要找到一种方法来保存您获得的可分割数据:
getIntent().getParcelableExtra("hjClient"))
该调用应该是“SharedPreferences”或其他持久性数据存储。
这不容易实现,因为如果您有其他方式可以让用户访问此活动,那么您需要考虑到这一点。
另一种方法(在另一个答案中提到但没有很好地解释)是将数据捆绑在意图中以开始下一个活动,然后当该活动完成时,使用'setResult'在'onActivityForResult'中传回该数据如下所述:
Get result from an activity after finish(); in an Android unit test
然后检查数据的结果并重新填充客户端对象。
结论:不要指望用户能够在他们上次看到状态的情况下返回任何活动,而不会持续数据重新创建该状态。
答案 1 :(得分:0)
您可以使用startActivityForResult代替startActivity,然后在其他活动完成时发回Intent。
答案 2 :(得分:0)
您可以尝试使用if(peer_connection[signal.id]){
//do something...
}else{
peer_connection[signal.id] = new PeerConnection(...
}
在活动消失之前保存数据。