Java Can';无法在android中保存实例状态
在我的应用程序中,我尝试使用onSaveInstanceState中的putSerializable方法保存ArrayList状态。并将其还原为onCreate和onRestoreInstanceState。在我的应用程序中,如果没有保存此对象的实例,则将从internet数据创建它。但我一直在尝试测试这个解决方案,ArrayList开始从网络下载。 有人能帮我吗Java Can';无法在android中保存实例状态,java,android,savestate,Java,Android,Savestate,在我的应用程序中,我尝试使用onSaveInstanceState中的putSerializable方法保存ArrayList状态。并将其还原为onCreate和onRestoreInstanceState。在我的应用程序中,如果没有保存此对象的实例,则将从internet数据创建它。但我一直在尝试测试这个解决方案,ArrayList开始从网络下载。 有人能帮我吗 public class Activity extends SherlockActivity { ListView listVie
public class Activity extends SherlockActivity {
ListView listView;
SlidingMenu slidingMenu;
ArrayList<HashMap<String, String>> newsList = null;
String url = "/////here_my_url////";
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setTitle(R.string.news_vatican);
listView = (ListView) findViewById(R.id.newslist);
slidingMenu = new SlidingMenu(this);
slidingMenu.setMode(SlidingMenu.LEFT);
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
slidingMenu.setFadeDegree(0.35f);
slidingMenu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
slidingMenu.setMenu(R.layout.slidingmenu);
slidingMenu.setBehindOffset(150);
if (savedInstanceState != null){
newsList = (ArrayList<HashMap<String, String>>) savedInstanceState.getSerializable("list");
Log.e("Activity", "RESTORING");
} else {
Log.e("Activity", "PARSING NEW");
JSONParser parser = new JSONParser(this);
parser.execute(url);
try {
newsList = parser.get();
} catch (InterruptedException e) {
e.printStackTrace();
Log.e("Activity", "Failed to get newslist");
} catch (ExecutionException e) {
e.printStackTrace();
Log.e("Activity", "Failed to get newslist");
}
}
listView.setAdapter(new NewsAdapter(getApplicationContext(), newsList));
}
@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putSerializable("list", newsList);
super.onSaveInstanceState(savedInstanceState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
newsList = (ArrayList<HashMap<String, String>>) savedInstanceState.getSerializable("list");
}
公共类活动扩展了SherlockActivity{
列表视图列表视图;
滑动菜单滑动菜单;
ArrayList新闻列表=null;
字符串url=“/////here\u my\u url///”;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setTitle(R.string.news_梵蒂冈);
listView=(listView)findViewById(R.id.newslist);
滑动菜单=新的滑动菜单(本);
滑动菜单。设置模式(滑动菜单。左);
slidingMenu.SetTouchMode高于(slidingMenu.TOUCHMODE\u全屏);
滑动菜单。设置淡入淡出度(0.35f);
slidingMenu.attachToActivity(此为slidingMenu.SlidingU内容);
slidingMenu.setMenu(R.layout.slidingMenu);
滑动菜单。设置初始偏移(150);
如果(savedInstanceState!=null){
新闻列表=(ArrayList)savedInstanceState.getSerializable(“列表”);
日志e(“活动”、“恢复”);
}否则{
Log.e(“活动”,“解析新”);
JSONParser=新的JSONParser(this);
parser.execute(url);
试一试{
newsList=parser.get();
}捕捉(中断异常e){
e、 printStackTrace();
Log.e(“活动”,“获取新闻列表失败”);
}捕获(执行例外){
e、 printStackTrace();
Log.e(“活动”,“获取新闻列表失败”);
}
}
setAdapter(新的新闻适配器(getApplicationContext(),newsList));
}
@凌驾
SaveInstanceState上受保护的空(Bundle savedInstanceState){
savedInstanceState.putSerializable(“列表”,新闻列表);
super.onSaveInstanceState(savedInstanceState);
}
@凌驾
RestoreInstanceState上的受保护无效(Bundle savedInstanceState){
super.onRestoreInstanceState(savedInstanceState);
新闻列表=(ArrayList)savedInstanceState.getSerializable(“列表”);
}
如果列表不太大,一个简单的选择是将其保存到共享首选项。但是,您需要序列化ArrayList,因为您只能存储字符串
您可以在onSaveInstanceState()中尝试类似的操作
获取SharedReferences编辑器
SharedReferences.Editor=GetSharedReferences(“共享的_首选项”,0).edit();
增加你的价值
editor.putString(“myList”,serialize(myList));
提交更改
editor.commit()
然后,您可以在任何地方访问此列表,例如在onCreate()
方法中,即使您的活动已通过执行
SharedPreferences preferences = getSharedPreferences("shared_preferences",0);
ArrayList<HashMap<String,String>> newsList = deserialize(preferences.getString("newsList", "");
SharedReferences preferences=GetSharedReferences(“shared_preferences”,0);
ArrayList newsList=反序列化(preferences.getString(“newsList”,“newsList”);
同样,这需要额外创建方法来序列化和反序列化您的ArrayList,但如果这是唯一需要持久化的数据,那么这肯定是一个简单的选择。恢复状态和持久化数据之间存在差异。即使将设备从纵向旋转到纵向,ArrayList是否也会再次下载横向(或反之亦然)?在我的应用程序android:configChanges=“orientation”android:screenOrientation=“纵向”中,我只使用纵向。在这种情况下,onSaveInstanceState(Bundle)
对你来说没什么用。你需要的是一种在后续发布中保存数据的方法。我说的对吗?是的,当我打开滑动菜单时,转到另一个活动,然后尝试启动此活动。我的ArrayList开始每次从internet下载。但我想还原此对象。我希望你理解我。你多长时间下载一次ed是否更新(下载新副本)列表?可能的解决方案:使用数据库存储条目,或将ArrayList写入内部存储器。