2017-06-13 6 views
0

Androidプログラミングの新機能である、私のアプリは、使用中にユーザーがさまざまなアクティビティに変更している間に、サーバーとの常時接続を維持する(状態と更新を取得する)一般的にアプリ。異なるAndroidの活動中にソケットとサーバーを維持する

ユーザーがさまざまなアクティビティクラスに変更しても、サーバーへの接続が一定のままである可​​能性があります。

しかし、主なアクティビティでは、プレーヤーが別のアクティビティに変更されても常に実行されるバックグラウンドハンドラを作成することがあります。

このハンドラは、一種のバックグラウンドタスクのように、サーバとの接触を維持するエンティティであり、その時点で実行されているすべてのアクティビティに表示するステータスも伝えます。

OnCreate(....) 
{ 
       handler=new Handler(); 
       handler.postDelayed(new Runnable() { 
        @Override 
        public void run() { 
          tick(); 
          handler.postDelayed(this,1000); 
        } 
       },1000); 
    } 

void tick() 
    { 
    communicate with server 
    } 

しかし、別の活動へのユーザーの変更は、ハンドラはまだ何を実行しない場合のようなもの?データを取得したときに関数を呼び出す何らかの種類のソケットコールバックを設定すると、別のアクティビティが実行されているにもかかわらず、ソケットからサーバーからデータを受け取ることができますが、そのコールバックはメインアクティビティにあります。他のアクティビティがアクティブな場合

また、ソケットから取得した新しい情報を、そのUIを更新するために実行されているすべてのアクティビティに伝達する方法。私は、すべてのアクティビティがアクセスできるデータ構造を持っていると思っています。それは、スレッドや、サーバと通信しているものによって占められています。

誰かが例を持っているか、それを行う標準的な方法を知っていますか?

おかげ

+0

あなたはシングルトンパターンを見たいでしょう。どのアクティビティにもソケットを格納しないでください –

答えて

0

これは私のために動作しますが、私は(私が読んまだ試していないとして)サービスを使用してのように、活動を変更するときに生きているソケット接続を維持するためのより良い方法があるかなり確信しています。あなたはここでサービスの例を見てすることができます:Services Example(私はソケットを作成)私の主な活動で

public static Socket socket; 

    public static Socket getSocket(){ 
     return socket; 
    } 

    public static synchronized void setSocket(Socket socket){ 
     MainActivity.socket = socket; 
    } 

public class ClientThread implements Runnable { 

     @Override 
     public void run() { 
      try { 
       InetAddress serverAddr = InetAddress.getByName(SERVER_IP); 
       socket = new Socket(serverAddr, SERVERPORT); 
       setSocket(socket); 
       if(socket!=null){ 
        Intent goToNextActivity = new Intent(getApplicationContext(), SecondActivity.class); 
        startActivity(goToNextActivity); 
       } 

      } catch (UnknownHostException e1) { 
       e1.printStackTrace(); 

      } catch (IOException e1) { 
       e1.printStackTrace(); 

      } 
     } 

    } 

を私の第二の活動では、私はちょうど同じソケットを使用するには、このようにそれを呼び出します私は作成しました(例えば)

MainActivity.getSocket().getOutputStream().write(String.valueOf(multiplier).getBytes()); 

私にとってはうまくいきます!

+0

静的変数が悪いです。アクティビティのグローバルなインスタンスも...サービスが優先される –

+0

なぜ静的変数が悪いのか尋ねることはできますか? (好奇心)彼らの値は簡単に変更することができますか?うん、私はサービスがベストプラクティスになると思う。 – Marcus

+0

私は言葉を言い換えると、任意の状態を運ぶアクティビティの静的変数は、メモリリークを引き起こす可能性があります。そして、OSはあなたのMainActivityを殺すことができるので、ソケットを取り除くことができます –

関連する問題