在Tabs之间共享对象(不同的活动)

时间:2011-11-14 15:16:08

标签: android class android-activity tabs

我正在尝试为问题提出最佳解决方案:我正在开发一个包含3个标签的应用。我从休息服务获取xml数据并将其解析为一个对象(只有一个请求)。 3个选项卡现在显示此数据的不同部分。我正在考虑将应用程序拆分为不同的活动,以使代码更具可读性。我如何分享活动之间的日期?我知道这个问题已经提出了一百万次,但我仍然无法提出解决方案。

  1. application object需要从Application类派生,但我的主要活动已经从TabActivity类派生。使用不同的主类,然后用意图启动我的tab类?

  2. A HashMap of WeakReferences to Objects.似乎浪费了记忆但是可能。

  3. 将所有代码放入一个活动中并完成。

  4. 感谢您的帮助:)

5 个答案:

答案 0 :(得分:1)

在我的所有应用程序中,我使用上下文类(通过Singleton调用),保留所有应用程序级别信息和数据通过不同的活动分享。

顺便说一下,这会在您的应用程序中引入一个模型级别(在MVC意义上),在软件设计中,该部分应该用于保存表示用户数据和应用程序状态的数据。

Singleton示例:

public class AppContext {

    public String username = null;

    //////////////////
    // below the singleton implementation
    //////////////////

    private static final AppContext instance = new AppContext();

    // Private constructor prevents instantiation from other classes
    private AppContext() { }

    public static AppContext getInstance() {
        return instance;
    }
}

当您从网上获取数据时(此处为用户名):

AppContext.getInstance().username = receivedUsername;

要参加您的某项活动:

myLabel.setText(AppContext.getInstance().username);
PS1:扩展应用程序以满足这样的目的对我来说似乎不是一件好事。扩展Application类应该扩展正常的应用程序行为,而不是存储公共数据的意思。

PS2:您的弱参考地图可以添加到Context对象中以构建您的数据

答案 1 :(得分:1)

理想的解决方案是,活动通知启动并处理其余请求的服务,将结果保存在某个地方(如sqlite-db),然后服务通知活动事务已完成,以便它可以查询数据

但是你只有一个请求,我认为你不打算做上面提到的那些,所以我会去找3号。

答案 2 :(得分:1)

数据:

import android.app.Application;
public class Data extends Application {

private int blupp = 0;

public void setBlupp(final int bla) {
    blupp = bla;
}

public int getBlupp() {
    return blupp;
}
}

在一个活动的oncreate()方法中设置数据:

final Data myData = ((Data) getApplicationContext());
myData.setBlupp(12);

在另一个的oncreate()方法中获取它:

final Data myData = ((Data) getApplicationContext());
final int test = myData.getBlupp();

在android清单中:

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:name="Data">

必须将班级数据放在那里。这很简单。格式化在这个论坛中有点混乱。我不太了解代码格式。 :(感谢所有帮助。

答案 3 :(得分:0)

尝试使用

创建对象

public static Object ....

这个静态对象可以用于你的所有类,你可以通过ClassName.objectName访问对象

答案 4 :(得分:0)

根据数据的不同,有很多方法可以做到这一点。数据有多大?如果它是纯文本的,而不是非常庞大,那么在整个应用程序生命周期内将其保留在内存中可能不是一个问题。

如果将应用程序拆分为不同的活动,则有两种选择:

  • 将活动之间的数据作为意图附加内容传递。假设默认显示的活动提取数据。当您想要查看数据的其他部分时,可以使用getIntent().getExtras()将所需数据捆绑到intent中,并在新创建的活动中检索它。
  • 将数据保存在单个或作为Application子类的实例变量中。我建议不要使用单例作为拥有自己的对象而不引用其他对象会使你的代码更容易出现内存泄漏。在我看来,将数据保存在Application类中是一种更好的方法。

如上所述,正确的解决方案取决于您的数据。如果您的所有活动都显示数据的不同部分,我可能会将其保留在我的Application子类中。但是,如果您的应用程序的结构类似于联系人列表(一个用于显示联系人的活动,一个活动用于显示联系人的详细信息),我可能会将我的数据放在主要活动中并传递必要的详细信息我的其他活动。