2016-08-21 30 views
0

AsyncTaskを使用してサーバーから複数のメッセージを受信でき、送信方法も知っています。ボタンをクリックしたときにメッセージをサーバーに送信

ボタンの中断/複数のフラグメントからの取り込みを受け取ったときに、どのようにメッセージを送信できるかわかりません。

IフラグメントA上の1つのボタンとフラグメントB.

フラグメントA

public class Fragmento_A extends android.support.v4.app.Fragment{ 

    Button button; 
    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.activity_third,container,false); 

     button = (Button) v.findViewById(R.id.button); 

     new Cliente("192.168.2.5",6000,button,Fragment_B.button).execute(); 

     return v; 
    } 
} 

フラグメントB

public class Fragmento_B extends android.support.v4.app.Fragment{ 

    public static Button button; 
    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.activity_third,container,false); 

     button = (Button) v.findViewById(R.id.button); 

     return v; 
    } 
} 

AsyncTask

public class Cliente extends AsyncTask<Void, String, Void> { 

    String dstAddress; 
    int dstPort; 
    Button button,button2 

    public Cliente(String addr, int port, Button button, Button button2) { 

    this.button = button; 
    this.button2 = button2; 
    } 

    @Override 
    protected Void doInBackground(Void... arg0) { 
      Socket socket = null; 
      try { 
       socket = new Socket(dstAddress, dstPort); 
       while(true) { 

        //what to do here? 
       } 

      } catch (UnknownHostException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 

      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 

      } finally { 
       if (socket != null) { 
        try { 
         socket.close(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
      } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(String... values) {} 

に1つのボタンがボタンはクニックですFragment_Aでkedを送信すると、Button_Aが押され(一度だけ実行されます)、Fragment_BでボタンがクリックされるとButton_Bが押されます(一度だけ実行されます)。

それとも、最も簡単な方法は、サーバーに常にボタンの状態を送信することであり、彼が決定した文字列/ INTを取得するときに、サーバーが処理します...

答えて

0

簡単に(多分その美しいではない)ソリューションブロッキングキューを使用することです。 AsyncTaskが生成されるメインスレッドでBlockingQueueを作成し、finalにします。次に、ボタンが押されたときにキューにメモを書き出します(送信するデータを含む文字列をキューに書き込むことができます)。また、AsyncTaskでキューから要素を読み込んで内容を送信するループを作成します。

BlockingQueue

お役に立てば幸いです。

+0

簡単な解決策があるとは思うが、それはうまくいくかもしれない。誰か他の人が返事をするかどうか見てみましょう。 –

+0

パブリック静的文字列を作成するだけではどうですか?同じじゃない? –

+0

いいえ、それは同じではありません。理論的にはうまくいくが、それはトライドルにとって安全ではない。明らかな理由がなくてもアプリが突然クラッシュする可能性があります。これは、2つのスレッドが同じメモリアドレスに同時にアクセスしようとしたときに発生します。だからあなたはスレッドをブロックします。 BlockingQueueは、問題がBlockingQueueで発生しないように、最初のメッセージが書き込まれるまで2番目のスレッドをブロックします。 – theCNG27

関連する問題