2012-02-16 36 views
1

アプリをビルドしているtcpサーバーへの読み書きに問題があります。最近のスレッドでは、代わりにサービスを使用するように提案されましたが、これはasyncTaskを提案した学校向けのプロジェクトです。ソケットからのasynctaskの読み取り

iveクラスは自分のアクティビティクラスと非同期であり、アクティビティでは何も起こっていませんが、動作している文字列を送信することは非同期メソッドで行います。私が知っている

class ServerTask extends AsyncTask<Void, Void, Void>{ 

     public static String ip = "10.0.2.2"; 
     public static int port = 2002; 
     Socket socket; 
     public DataInputStream dis; 
     public DataOutputStream dos; 
     public String message; 

     @Override 
     protected Void doInBackground(Void... params) { 

      try { 
       socket = new Socket(ip, port); 
       dis = new DataInputStream(socket.getInputStream()); 
       dos = new DataOutputStream(socket.getOutputStream()); 

      } catch (Exception e) { 
       Log.i("AsyncTank", "Cannot create Socket"); 
      } 
      while(socket.isConnected()){ 
       read();      
        } 
       } 

      } 
      return null; 
     } 

     public void write(String message) { 
      try { 
       if (socket.isConnected()){ 
        dos.writeUTF(message); 
        dos.flush(); 
       } else { 
        Log.i("AsynkTask", "Socket appears to be closed"); 
       } 
      } catch (Exception e) { 
       Log.i("AsynkTask", "Writing failed"); 
      } 
     } 

     public String read() { 
      try { 
       if (socket.isConnected()) { 
        message = dis.readLine(); 
       } else { 
        Log.i("AsyncTask", "Cannot read"); 
       } 
      } catch (Exception e) { 
       Log.i("AsyncTask", "Cannot read from stream"); 
      } 
      return message; 
     } 
    } 

物事、サーバーはメッセージを取得しているが、私はそのイムはそれをすべての後に1行として表示されます新しい行か何かを押していないと信じて私をリードサーバを再起動するまで、それが更新をdoesntのその閉鎖。しかし、これはまた、責任を負わない私がそれを読んでいなければならないサーバーかもしれません。

しかし、読んだ部分はうまくいきません。メソッドを呼び出して、常にサーバーのソケットを聞いて反応させる方法はわかりません。私はdoInBackGroundの戻り値の直前にスレッドを作成しようとしましたが、アプリケーションの起動は数秒間働きますが、メモリ不足のために強制終了しますか?常に聞き続けるためにスレッドが必要ですか?

あなたが推測しているように、readメソッドが最終的に自分のアクティビティクラスのtextViewを更新するようにチャットすることがポイントです。 sendメソッドは "働いています"が、以前のようにファンキーなビジネスをしているとは言いましたが、そうではありません。

もう1つ、私が持っているように、あるいはサーバーがデータを送信してからメソッドを呼び出すときに反応する必要があるかのように、メソッドを読み取ることも可能ですか?

編集私は今doInBackGroundする読み取り部分、またはそれの少なくとも一部を移動した のでその今

単にサーバ内のプリントラインをハードコードに変更に伴い

これは私がそれを読んで作られましたクライアントのラインになっているので、現時点では本当にうまく動作していると推測しています。

どうやって見ていますか?それはまったくこのコードを駄目にしていて、他のやり方でやるべきですか?私の機能を持っていますが、話すのをより良くすることを学ぶことは決して悪いことではありません。

答えて

0

AsyncTaskのdoInBackground()メソッドでは、書き込みと読み取りの両方をSocketに行う必要があります。両方とも時間がかかり、メイン(UI)スレッドをブロックする可能性があるからです。上記のwrite()メソッドの呼び出し方法はわかりませんが、question that might be relatedを見てみることもできます。

+0

メインクラスでServerTaskクラスをインスタンス化し、単にserverTask.write(tbMessage.getText()。toString());を実行します。非同期タスクでそれを持っていると思っていましたが、非同期を作成せずに書き込みを呼び出す方法はわかりませんでしたが、params [0]を書くことになりましたが、毎回serverTask.execute(テキスト)毎回新しい接続を作成することによってそれは? – Gvs

+0

もう1つのこと、私はdoInBackGroundでストリームを開きません。 – Gvs

+0

AsyncTasksに読み書きを行い、ストリームをパラメータとして渡すことができます。上記のコードでは、doInBackground()メソッドのコードはバックグラウンドで実行され、doInBackground()から呼び出しているのでread()の呼び出しも実行されます。 write()は、少なくともあなたがインクルードしたコードからのものではないようです。 – jengelsma

関連する問題