Java Can';无法在android中保存实例状态

Java Can';无法在android中保存实例状态,java,android,savestate,Java,Android,Savestate,在我的应用程序中,我尝试使用onSaveInstanceState中的putSerializable方法保存ArrayList状态。并将其还原为onCreate和onRestoreInstanceState。在我的应用程序中,如果没有保存此对象的实例,则将从internet数据创建它。但我一直在尝试测试这个解决方案,ArrayList开始从网络下载。 有人能帮我吗 public class Activity extends SherlockActivity { ListView listVie

在我的应用程序中,我尝试使用onSaveInstanceState中的putSerializable方法保存ArrayList状态。并将其还原为onCreate和onRestoreInstanceState。在我的应用程序中,如果没有保存此对象的实例,则将从internet数据创建它。但我一直在尝试测试这个解决方案,ArrayList开始从网络下载。 有人能帮我吗

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写入内部存储器。