【问题标题】:Passing instances of classes between activitys在活动之间传递类的实例
【发布时间】:2012-03-07 14:00:34
【问题描述】:

如果我有 A 类和 B 类,A 类作为一个菜单,有 2 个按钮,一个用于连接一个用于登录。当我按下连接时,我运行这个方法:

    private void connect(){
    Thread t1 = new Thread(){
        public void run(){
    connection_class = new ConnectionClass();
    connection_class.run();
        }
    };t1.start();
}

在构造函数中调用我的 ConnectionClass:

    public ConnectionClass(){
        socket = new Socket("address", port);
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
}

在连接到服务器并按下登录时效果很好(没有 onClick 的东西):

        connection_class.MethodToWriteToServer("CommandThatLogsMeIn");     
        Intent i = new Intent().setClass(v.getContext(), Class.class);          
        startActivity(i);

这很好,但是当我在 B 类时,我想使用它的相同实例。我可以只创建一个新线程和该类的实例,但这会破坏开始菜单的目的并要求我再次登录。

是否有可能在启动时将实例作为参数传递给 Activity,或者 android 的做法是什么?

作为旁注,我真的不需要菜单,但我在作业到期之前有一些空闲时间,我想我不妨试试。

【问题讨论】:

  • 从不同的地方使用相同的后台任务听起来像是使用服务的好地方:) 除此之外,您可以使用持有线程的单例。应该可以工作,因为默认情况下应用程序的所有活动都在同一个进程中。
  • 是的,我想这会是我真的不知道如何使用服务,但我想我必须研究一下,哦,为什么不能像 C# 一样简单:p。

标签: android multithreading android-activity android-intent


【解决方案1】:

我昨天刚刚完成了一个这样的项目。

例如,您有一个名为WebService 的连接管理器:

// singleton class
public class WebService {

    private static WebService instance;

    private WebService() {}

    public static WebService getInstance() {
        if (instance == null)
            instance = new WebService();
        return instance;
    }// getInstance()

    public void login() {};
    public void getFeeds() {};
    public void logout() {};
}

然后你可以把它放在一个像这样的基础活动中:

public class WebServiceActivity extends Activity {

    private final WebService fWebService = WebService.getInstance();

    protected WebService ws() { return fWebService; }
}

那么,你有两个活动,LoginActivityWorkingActivity

public class LoginActivity extends WebServiceActivity {

    buttonLogin.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            try {
                ws().login();

                // start WorkingActivity if logging in ok
            } catch (...) { ... }
        }
    });
}

public class WorkingActivity extends WebServiceActivity {

    buttonGetFeeds.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            ws().getFeeds();
        }
    });

    buttonLogout.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            ws().logout();
            finish();
        }
    });
}

无论如何,有很多方法。上面那个是我的。希望对你有帮助:-)

【讨论】:

  • 您最终会为不同的活动拥有不同的WebService 实例,因为每个活动都有fWebService = new WebService();
  • 谢谢 zapl,我忘了 WebService 是单例类。我会解决的。
  • 老兄,你的救命稻草,这很好用,刚刚从我的构造函数中做了一个线程并添加了一些,现在它工作得很好,据我所知,虽然我没有机会测试一切然而。再次感谢
  • @sek,很高兴它对你有帮助 :-)
【解决方案2】:

我仍然不确定这是否正确。但我更喜欢像这样使用类的静态实例:

// Create this class just once
public class MediaManager {
    public static MediaManager instance;

    public MediaManager() {
        instance = this;
    }

    public void addNewImage(Bitmap bitmap) {
          //....
    }
}

//

public class AnotherClass {
      public void doSomething() {
          MediaManager.instance.addNewImage(..);
      }
}

如果有人知道使用管理器类的更好方法,请发表评论。

【讨论】:

  • 您每次调用... = new MediaManager() 时都会覆盖MediaManager.instance,这样您就不会得到一个静态实例。参见例如en.wikipedia.org/wiki/Singleton_pattern#Traditional_simple_way 你是怎么做到的。
  • 当我评论我的答案时,您应该只创建一个 MediaManager... 或者您可以使用静态方法获取实例并检查它是否为空...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2017-08-05
相关资源
最近更新 更多