0

今天几乎一整天,我一直在试图解决这个问题,但我似乎无法正确解决。我了解如何使用文件输出/输入流。但是,由于 ArrayList 不是“int”,我不能只通过它来传递我的 ArrayList。我收集到“序列化”将我的 ArrayList 转换为字节,然后可以通过 File-Output/Input-Stream 对其进行操作。我不知道它是如何工作的。我从其他人那里窃取了“对象输入/输出流”代码,他们的目标似乎与我相同,但它对我不起作用。我查看了 Android Dev Docs 中的序列化,但无法弄清楚它是如何工作的。

有人可以请吗?

A)用更简单的术语解释序列化如何工作和/或如何执行它?

&

B)解释为什么下面的代码不起作用(例如,在我添加所有 Object(in/out)putStream 之前,我的代码会动态实时填充 Listview,现在当按钮是推,也不会加载任何东西,也不会抛出任何错误)。

C)有没有更简单的方法来存储这个 ArrayList 以便它是持久数据。

package com.example.thepicker;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;

public class Settings extends Activity implements OnClickListener{


    EditText getit;
    ImageButton giveit;
    ListView thelist;
    ArrayList<String> items;
    ArrayAdapter<String> list;
    Intent pass;
    FileOutputStream persistout;
    FileInputStream persistin;
    ObjectOutputStream osistout;
    ObjectInputStream osistin;

    @SuppressWarnings("unchecked")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.settings);

        items = new ArrayList<String>();
        list = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,items);
        pass = new Intent(this,Main.class);
        getit = (EditText) findViewById(R.id.getit);
        giveit = (ImageButton) findViewById(R.id.giveit);
        thelist = (ListView) findViewById(R.id.thelist);


        try {
                persistin = openFileInput("FILENAME");
                osistin = new ObjectInputStream(persistin);
                items = (ArrayList<String>) osistin.readObject();
                osistin.close();
                persistin.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }



        thelist.setAdapter(list);
        list.notifyDataSetChanged();
        giveit.setOnClickListener(this);
    }

    @Override
    public void onPause() {
        super.onPause();

        pass.putExtra("total", items);  
        this.startActivity(pass);

        try {
            persistout = openFileOutput("FILENAME", Context.MODE_PRIVATE);
            osistout = new ObjectOutputStream(persistout);
            osistout.writeObject(items);
            osistout.close();
            persistout.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


}



    @Override
    public void onClick(View v) {
    items.add(getit.getText().toString());
    list.notifyDataSetChanged();
}

}
4

1 回答 1

1

A)序列化不是你的问题。据我所知,你做得“正确”。我强烈建议使用 sqlite 而不是序列化,但那是因为我是一个 db 疯子。

B)您正在创建一个顶部列表

项目 = 新的 ArrayList();

然后使用该列表创建适配器。它是一个变量引用。然后,您在创建适配器后反序列化您的列表。适配器引用了您创建的另一个列表。您的项目 VARIABLE 现在完全指向不同的列表。反序列化后执行适配器初始化,它应该可以工作。

C)不确定“更容易”,但 sqlite 是“更好”。

但是,您的设计存在重大的系统性问题。您在主线程中执行各种 I/O,这是一个禁忌。您正在阅读 onCreate,但保存在 onPause 中,这应该可以工作,但不平衡(onCreate 的 yang 是 onDestroy。onResume 与 onPause 一起使用)。不是说它不起作用,而是它很奇怪。

保持您的 List var local 也感觉很奇怪,但是查看 Android 代码,只要您不重新定义它(就像您现在一样),您列表中的引用应该是相同的。

于 2013-03-17T02:42:02.300 回答