【问题标题】:Arraylist keep empty when comeback from another activity从另一个活动回来时,Arraylist 保持为空
【发布时间】:2018-10-21 12:20:10
【问题描述】:

所以情况很简单,我有 RegisterActivity,我想创建一个类用户的数组列表并存储有关 id、电子邮件和密码的数据。然后,我想将该值传递给 LoginActivity,以便我可以使用它来验证用户数据是否已经创建。

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

这就是我的工作。

在注册活动中

                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);

在登录活动中

ArrayList<User> users;
Bundle bundleUser;

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

你有什么解决办法吗?

请帮帮我

【问题讨论】:

  • 我认为您的数据在活动完成状态期间丢失,因此您应该将数据保持在全局状态...您可以使用任何其他单例类或将您的日期保存到 Application 类中...
  • 您还可以将数据存储在 SharedPreference 或 SQLite DB 中
  • 正如 Sniffer 提到的,您可以轻松地使用共享首选项来完成此任务。导航到此stackoverflow.com/questions/7057845/… 的答案。它包含序列化数组列表并添加到共享参数的方法

标签: java android arraylist android-activity


【解决方案1】:

Armit 和 Sniffer 都是正确的(我没有时间检查 lucefer 关于序列化整个数组并一次存储它的链接)。根据您的情况,您有多种选择。

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

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

-利用 SavedInstanceState,它甚至可以保护数据免受屏幕旋转变化的影响。

-创建一个新的 Java 类并将您的数据存储在那里。只要应用程序打开(即使应用程序移动到后台),存储在 Java 类文件中的数据将保持其值,因为存储在 Activity 中的数据将在方向更改甚至移动到另一个时重置其值如果数据没有被显式存储或传递,则活动...(以下是 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();

当您想要存储少量数据并在应用程序关闭并稍后再次打开时(或直到应用程序已卸载或开发人员明确更改)仍保留它时

-使用共享首选项。可以把它想象成一个微型数据库,每个 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);
    }
}

当您想要存储大量数据并在应用程序关闭并稍后再次打开时(或直到应用程序被开发人员卸载或明确更改)仍保留这些数据时

p>

-使用SQLite等数据库

【讨论】:

  • 嗨,谢谢你教我很多新东西。好的,所以我已经使用新的单例 java 类尝试了您的第一个解决方案,然后我在那里创建了一个名为 user 的类 User 的数组列表,然后创建了一个名为 saveUserdata 的方法,该方法是将数据添加到数组列表中。我在 RegisterActivity 上使用该方法。然后在我访问 LoginActivity 中的 arraylist 并检查数组的大小后,arraylist 表示 0 值。你知道这是为什么吗?
  • 是的,您可能没有制作真正的单身人士。对于 Singleton,它基本上意味着类是静态的(类对象只能引用一个)确保使用相同的类对象来保存变量,就像检索变量一样
  • 我会将我的答案更新为真正的单身人士,而不必在任何地方都使用“静态”关键字,因为如果你不小心,这可能会变得混乱并导致泄漏
  • 如果由于某种原因这不起作用,我会稍后再回来查看,如果它确实解决了您的问题,请单击左侧的绿色复选标记“接受我的回答”回答 :-) 祝你好运!
  • 非常感谢,你拯救了我的大学任务,它工作得很好,但我仍然不知道单身班是什么意思,也许我应该了解更多
猜你喜欢
  • 1970-01-01
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
相关资源
最近更新 更多