2012-03-07 40 views
3

如果我获得了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大IM东西):

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

这工作得很好,但是当在类BI中im想使用它的同一个实例。我可以做一个新的线程和类的实例,但这会打败开始菜单的目的,并要求我再次登录。

是否有可能将实例作为参数传递给活动时启动它或什么是Android的方式呢?

作为一个旁注,我真的不需要菜单,但我得到了一些空闲时间之前,任务是由于我认为我可能会尝试它。

+1

从不同的地方使用相同的背景任务听起来像一个伟大的地方使用服务:)除此之外,你可以使用一个持有线程的单例。应该工作,因为默认情况下,应用程序的所有活动都处于相同的过程中。 – zapl 2012-03-07 14:06:18

+0

是的,我想这将是我真的不知道如何使用服务,但我想生病必须看看它,哦为什么不能像C#一样简单:页。 – Gvs 2012-03-07 14:54:36

回答

2

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

比如你有这样的连接管理器,称为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(); 
     } 
    }); 
} 

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

+1

您最终为不同的活动提供了'WebService'的不同实例,因为每个''fWebService = new WebService();' – zapl 2012-03-07 14:34:57

+0

谢谢zapl,我忘记了'WebService'是单例类。我会解决它。 – 2012-03-07 14:47:41

+0

Dude你的总救生员这个工程很好,只是从我的构造函数中创建了一个线程,并添加了一些,现在它工作的很好,据我所知,尽管我还没有机会测试所有东西。再次感谢 – Gvs 2012-03-07 15:48:05

1

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

// 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(..); 
     } 
} 

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

+2

你每次调用'... = new MediaManager()'时都会覆盖'MediaManager.instance',这样你就不会得到一个静态实例。见例如http://en.wikipedia.org/wiki/Singleton_pattern#Traditional_simple_way如何做到这一点。 – zapl 2012-03-07 14:18:42

+0

正如我评论我的答案,你应该创建MediaManager只是一个...或者,你可以使用静态方法来获取实例,并检查它是否为空... – 2012-03-07 15:41:27