【发布时间】:2012-01-26 22:04:32
【问题描述】:
当我进行文件传输并且设备失去互联网连接时DataOutputStream.write 有时几乎无法定义。
我知道这很正常,因为底层套接字层正在尽可能快地完成它的工作。
我正在考虑使用
registerReceiver(mConnRec,new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
并在发生这种情况时抓住并执行socket.close() 或DataOutputStream.close()
强制DataOutputStream.write 停止阻塞并发生正常的代码流
更快。
这会起作用吗?或者我可以做些什么来控制阻塞?
我的另一个想法是每 5 秒启动一个线程
测试互联网是这样存在的
public boolean haveNetworkConn(Context ctx)
{
boolean HaveConnectedWifi = false;
boolean HaveConnectedMobile = false;
ConnectivityManager cm = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo[] netInfo = cm.getAllNetworkInfo();
for (NetworkInfo ni : netInfo)
{
if (ni.getTypeName().equalsIgnoreCase("WIFI"))
if (ni.isConnected())
HaveConnectedWifi = true;
if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
if (ni.isConnected())
HaveConnectedMobile = true;
}
return HaveConnectedWifi || HaveConnectedMobile;
}
如果返回 false,我可能会强制使用 socket.close。
真的很想对这个想法有一些反馈
更新
使用 registerReceiver BroadcastReceiver 运行一些测试。
当我关闭 OutputStream 和套接字本身的数据时,什么也没有发生。
它继续阻止out.write(buffer, 0, val);。这是最出乎意料的。
使用 Eclipse 并放置断点和单步执行..
private BroadcastReceiver mConnReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)){
return;
}
boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
NetworkInfo aNetworkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
if (!noConnectivity)
{
if ((aNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE) || (aNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI))
{
//Handle connected case
}
}
else
{
if ((aNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE) || (aNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI))
{
//Handle disconnected case
if(socket != null)
try {
out.close();
in.close();
socket.close();
} catch (IOException e) {
}
}
}
}
};
【问题讨论】:
标签: java android sockets ftp blocking