1

AsyncTask クラスを拡張するオブジェクトの doInBackground() メソッド内でソケットを開きます。私は使用後すぐにこのソケットを閉じます。しかし、エミュレーターの [戻る] ボタンを使用してメニューからアプリを起動するか、コードを変更せずに Eclipse からアプリを起動すると、BindException が発生します (TIME_WAIT に十分な時間を与えて 5 分後にこれを行っても)状態または 2MSL 待機状態)。

しかし、Eclipse でコードを編集して (2 つのランダムな文字を追加し、em を削除して保存するとします)、アプリを実行しても、この例外は発生しません。同じポートで複数の接続を受け入れるにはどうすればよいですか? setReuseAddress(true) を試しましたが、それも機能していないようです。

アクティビティの onResume() メソッドを実装し、その中で単に super.onResume() を呼び出します。この方法に取り組むことで解決策につながる可能性がありますか、それとも正確に何をしなければならないのでしょうか? 私はどんな考えにもオープンです。

助言がありますか?
@編集:

class LongOperation extends AsyncTask<String, Void, String> {
 private String fname;
String aa=""; 
@Override
protected void onPostExecute(String result) {
            ed.setText(result);

}

@Override
protected void onPreExecute() {
}

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

@Override
protected String doInBackground(String... arg0) {
    ServerSocket ss;

    try
        {

        ss = new ServerSocket(8000);
        s=ss.accept();
        s.setReuseAddress(true);
        BufferedReader get = new BufferedReader(new InputStreamReader(s.getInputStream()));
        aa=get.readLine();
        s.close();


        }
    catch(IOException e)
        {
        //System.out.println(e.toString());
        aa=""+e;

        }
    return aa;
}

}

アプリを再度実行すると、TextView に「BindException: Address already in use」という例外が表示されました。しかし、明らかにソケットを閉じました。

活動コード:

public class ContactReceiver extends Activity {
 TextView ed;Socket s;
public void onCreate(Bundle b){
super.onCreate(b);
setContentView(R.layout.receiver);
  ed=(TextView)findViewById(R.id.textView1);
   new LongOperation().execute("");

}
public void onPause(){
super.onPause();

}
public void onResume(){
super.onResume();
//  new LongOperation().execute("");
}  

アクティビティクラスは非公開です。AsyncTask クラスを子クラスの宿屋としてここに持っています

4

0 に答える 0