从另一个活动恢复时,Arraylist保持为空

时间:2018-10-21 12:20:11

标签: java android arraylist android-activity

因此情况很简单,我具有RegisterActivity,并且我想创建一个类user的arraylist并存储有关ID,电子邮件和密码的数据。然后,我想将该值传递给LoginActivity,以便可以使用它来验证用户数据是否已创建。

但是,每次我传递arraylist值时,它都会第一次起作用,然后在我返回RegisterActivity并尝试再次注册后,它不会存储到arraylist用户的第二个值,而是存储到第一个值,当我回到RegisterActivity时,arraylist为空。

这就是我的工作。

在RegisterActivity中

                users.add(new User(newId,strEmail,strPass));

                Intent i = new Intent(RegisterActivity.this,LoginActivity.class);

                Bundle bundle  = new Bundle();
                bundle.putSerializable("userData",users);
                i.putExtras(bundle);
                startActivity(i);

在LoginActivity中

ArrayList<User> users;
Bundle bundleUser;

    bundleUser = getIntent().getExtras();
    users = (ArrayList<User>) bundleUser.getSerializable("userData");

您有什么解决方案吗?

请帮助我

1 个答案:

答案 0 :(得分:0)

Armit和Sniffer都是正确的(我没有时间检查lucefer关于串行化整个阵列并一次存储它的链接)。您可以根据自己的情况在此处选择多个选项。

作为在Android中存储值的一般“经验法则”:

当您要在用户打开应用程序时(即使将应用程序移至后台)临时存储数据,但又想将数据重置为原始值(0,false或null(如果未定义))时,关闭应用程序的时间:

-使用SavedInstanceState甚至可以保护数据免受屏幕旋转更改的影响。

OR

-创建一个新的Java类并将数据存储在其中。只要应用程序处于打开状态(即使将应用程序移至后台),存储在Java类文件中的数据将保持其值;在活动中存储的数据将在方向更改时甚至在移至另一个应用程序时重置其值。如果未显式存储或传递数据,则活动...(下面是SINGELTON JAVA类的示例)

public class RegularJavaClass {
   public static RegularJavaClass myObj;

   public RegularJavaClass(){}

   public static RegularJavaClass getInstance() {
    if (myObj == null) {
        myObj = new RegularJavaClass();
    }

    return myObj;
   }

    private int myNumValue;
    private String myStringValue;

    public int getMyNumValue() {
    return myNumValue;
    }
    public void setMyNumValue(int myNumValue) {
    this.myNumValue = myNumValue;
   }
    public String getMyStringValue() {
    return myStringValue;
    }
    public void setMyStringValue(String myStringValue) {
    this.myStringValue = myStringValue;
    }
   }

当您召集该课程以存储草稿使用时

int someNum = 3000;
String someString = "saveThisString";

RegularJavaClass.getInstance().setMyNumValue(someNum);
RegularJavaClass.getInstance().setMyStringValue(someString);

当您想要检索此数据时

int retrieveNum = RegularJavaClass.getInstance().getMyNumValue();
String retrieveString = RegularJavaClass.getInstance().getMyStringValue();

当您要存储少量数据并保留它们时,即使稍后关闭应用程序并再次打开它(或直到应用程序已卸载该应用程序或由开发人员明确更改该应用程序)时,也要保留这些数据 >

-使用sharedPreferences。可以将其视为每个Android应用程序都自动随附的小型数据库。请记住,此处仅存储少量数据

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                SharedPreferences prefs =
                        getSharedPreferences("StorageName", MODE_PRIVATE);

                SharedPreferences.Editor editor = prefs.edit();
                //The value type determines the "put" in your case break the
                //array into a for statement and save each value
                for (String s : myArray) {
                    //s would be the value
                    //make a key for your stored value just like a HashMap
                    editor.putString(key, value).apply();

                }

            }
        });
        t.start();
    }
 }

以后找回存储的值

   @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

        SharedPreferences prefs =
                getSharedPreferences("StorageName", MODE_PRIVATE);
                //Always enter a default value for just in case the storage 
                 //value is empty
                String myStoredValue = prefs.getString(key,null);
    }
}

当您要存储大量数据并保留它们时,即使稍后关闭应用程序并再次打开它(或直到应用程序已卸载或开发人员明确更改了该应用程序) >

-使用SQLite之类的数据库