【问题标题】:An inquiry regarding Java classes objects and data transfer from one activity to another in AndroidAndroid 中关于 Java 类对象和从一个活动到另一个活动的数据传输的查询
【发布时间】:2012-06-20 21:59:28
【问题描述】:

所以我正在制作一个 Android 应用程序,我有一个 ListView(称为 showclients)链接到另一个(称为 ViewClient)。当调用showclients 时,它会从其他java 类中收集一堆数据并将其存储在ClientList 类型的对象中(我已经创建了)。

ViewClient 需要该信息,并且再次从头开始获取它需要很长时间,因此在showclients 中,我创建了一个名为Clistpublic static 变量,类型为ClientList,并创建了一个方法...

public static ClientList returnobj(){
    return Clist;
}

回到ViewClient我打电话

ClientList grief= showclients.returnobj();

它让我得到数据。我想知道为什么会这样,以及它是否可以在没有 Android 的 Java 上运行。

【问题讨论】:

  • showclients是类名吗,如果不是,是什么?
  • 是一个继承Activity的类。

标签: java android class object


【解决方案1】:

所以您问的是如何在活动之间共享数据。一种选择是将数据模型托管在应用程序类中。创建一个扩展 Application 的类,

public MyApplication extends Application { ...

在您的清单中,添加您的应用程序类,

   <application
        android:name=".MyApplication"
        ...

Application 类的生命周期允许您在其中托管数据。它超越了任何特定活动的开始/停止。将私有成员添加到您的 MyApplication 类,并提供 getter 和 setter 来访问数据,

public MyApplication extends Application {
  private MyData myData;

  public MyData getMyData() { return myData; }
  public void setMyData(MyData data) { this.myData = data; }
}

【讨论】:

  • 谢谢。您的示例代码虽然有点令人困惑,但我想我明白了。应用关闭时这些数据会消失吗?
  • 定义“应用关闭”。它超越了任何特定活动的开始和停止。数据显然不是持久的,因为 android 可以破坏您的应用程序的进程以为其他事情腾出空间。如果你需要持久性,你应该考虑使用 sqlite。
【解决方案2】:

你的问题到底是什么?

“没有 Android 的 Java”是什么意思? 由于 ListView、Activity 等是特定于 Android 的,我会说不。

但是您的“概念”应该/可以在没有 Android 的情况下工作。 -> 请提供更多信息...

恕我直言,您的描述有点神秘……也许可以发布更多代码。

【讨论】:

  • 我有一个活动的代码,我想在另一个活动中使用。它有效,但我不知道为什么。在第一个中,我有 public static ClientList Clist= new ClientList(objectinput,0);和上面的方法。当我进入第二个时,我只是使用了其中包含悲伤的代码,并且我得到了之前收集的所有数据,我不知道为什么。
  • 如果另一个活动处于活动状态,您的活动将继续存在,因此您仍然可以从另一个活动获取数据。但如果您的应用被 Android 操作系统“破坏”,您可能会丢失数据
  • 一个活动有一个生命周期,这意味着当你的活动第一次显示时,它就被创建了。然后它会尽可能长时间地存储在 RAM 中,因为创建 Activity 很耗电。但是,如果 Android 认为它需要更多内存并且您的 Activitiy 未在使用中,它会“销毁”您的 Activity。这意味着您的 Activity 实例丢失了,所有不是 static 的成员变量也丢失了。因此,如果您将其设为静态,它就会继续存在。欲了解更多信息,请参阅:developer.android.com/reference/android/app/…
【解决方案3】:

如果您要问这段确切的代码是否可以通过在 Java SE 上编译和运行(即“没有 Android”)来工作,那么 ,因为 Java SE没有您使用的某些类(例如Activity)。

对于 Java SE 中的图形用户界面,您应该使用像 SwingSWT 这样的库。

如果您要问传输数据的一般方案是否适用于 Java SE,那么可以。原因正是您使用了static 关键字。这意味着静态“变量”(实际上是一个成员)和静态方法是为整个showclients 类定义的,而不是专门为它的任何对象定义的。这意味着在您的程序中,静态成员的值是相同的,returnobj() 将返回相同的对象。

如果没有 static 关键字,对于您创建的 showclients 的每个对象,该值将只存在一次,而不是整个类。

这就是您的解决方案适用于 Android 的原因之一 - 如果该值不会存储在静态成员中,您将不得不引用实际的 showclients 对象,该对象可能会在您使用时随时从内存中删除其他活动正在显示(因为背景活动,在这种情况下showclients,可以随时删除)。因为该成员是静态的,所以只要 Java 虚拟机加载 showclients,它就会一直存在,对于您的目的而言,只要您需要。

最后,Jeffrey 的 解决方案更适合 Android 代码,因为您不会滥用 Activity 的定义来获取应该放在 dedicated piece of code 中的附加功能。在 Java SE 中,您将通过创建一个实现 Singleton pattern 的新类来实现类似的解决方案。实际上,在 Jeffrey 的示例中,MyApplication 是用于您的应用的单例。

【讨论】:

    【解决方案4】:

    我想你是在问静态关键字?静态方法(或变量)直接绑定到类本身,而不是其特定实例。最好在示例中显示,但要使用变量(不要以这种方式使用它,请阅读有关封装的信息):

    class A {
      public static String foo = "foo";
    
      public A() {
        foo = "bar";
      }
    }
    
    class B {
      public void something() {
        // suppose print exists
        print(A.foo); // prints foo
    
        A a = new A();
        print(A.foo); // prints bar
        print(a.foo); // prints bar
      }
    }
    

    给自己做一个简单的java应用程序(这就是w

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      相关资源
      最近更新 更多