我在扩展 AsyncTask 类的对象的 doInBackground() 方法中打开了一个套接字。我确实在使用后立即关闭了这个套接字。但是当我使用模拟器上的后退按钮然后从菜单启动我的应用程序时,或者当我从 eclipse 启动它而不对代码进行任何更改时,我得到 BindException(即使我在 5 分钟后这样做,给 TIME_WAIT 足够的时间状态或 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:地址已在使用中”。但显然我已经关闭了我的套接字。
活动代码:
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 类作为子类客栈