2012-03-07 9 views
3

クラスAおよびクラスBを取得した場合、クラスAは2つのボタンを1つにしてログインするためのメニューとして機能します。アクティビティ間でクラスのインスタンスを渡す

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の作品を、私は接続を押すとき、私はこの方法を実行しますもの):

これはうまく動作しますが、クラスBIのimが同じインスタンスを使用したいとき。私はクラスの新しいスレッドとインスタンスを実行することができますが、それはスタートメニューの目的を破り、もう一度ログインする必要があります。

起動時にインスタンスをパラメータとしてアクティビティに渡すことや、アンドロイドのやり方が何とかできますか?

私は実際にメニューが必要ありませんが、iveは割り当てが期限切れになる前に余裕があり、試してみるかもしれないと考えました。

+1

別の場所から同じバックグラウンドタスクを使用すると、サービスを使用するのに最適な場所のように聞こえます。それ以外に、スレッドを保持するシングルトンを使用できます。デフォルトでは、アプリケーションのすべてのアクティビティが同じプロセス内にあるので、動作する必要があります。 – zapl

+0

そう、私はそれが問題になると思うのですが、サービスの使い方はわかりませんが、病気を調べなければならないのはなぜですか? – Gvs

答えて

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

その後、次の2つの活動、LoginActivityを持っており、 WorkingActivity

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

それぞれが 'fWebService = new WebService();'を実行するので、異なるアクティビティに対して 'WebService'のインスタンスが違うことになります。 – zapl

+0

ありがとうございました、WebServiceはシングルトンクラスです。私はそれを修正します。 –

+0

この人生の偉大な人よ、ちょうど私のコンストラクタからスレッドを作り、これをいくつか追加したところ、まだすべてをテストする機会があったけれど、私が知る限り素晴らしいものになりました。もう一度ありがとう – Gvs

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

+0

私は私の答えにコメントするので、MediaManagerを1つだけ作成する必要があります。あるいは、静的メソッドを使用してインスタンスを取得し、nullであるかどうかを確認することができます。 –

関連する問題