UdpServer活动来自从Web下载的项目,Mainactivity则来自我创建的项目。当我在runUdpServer
内遍历代码ds.receive
时,问题是UdpServer activity
运行正常,它正在等待数据进入。
但是ds.receive
在MainActivity(my created project)
里面,当我踩到ds.receive
的时候,它立即去了错误的最后块,(找不到源问题)并解除分配。
为什么同一代码穿孔有两种不同的行为。我不知道下载的版本UdpServer活动中隐藏了哪些属性,这些属性使它能够成功运行,而挖掘失败。
public class UdpServer extends Activity {
private TextView textView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
runUdpServer();
}
private void runUdpServer() {
String lText;
byte[] lMsg = new byte[1500];
DatagramPacket dp = new DatagramPacket(lMsg, lMsg.length);
DatagramSocket ds = null;
try {
ds = new DatagramSocket(11112);
ds.setBroadcast(true);
//disable timeout for testing
ds.setSoTimeout(100000);
ds.receive(dp);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ds != null) {
ds.close();
}
}
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
runUdpServer();
}
private void runUdpServer() {
String lText;
byte[] lMsg = new byte[1500];
DatagramPacket dp = new DatagramPacket(lMsg, lMsg.length);
DatagramSocket ds = null;
try {
ds = new DatagramSocket(11112);
ds.setBroadcast(true);
//disable timeout for testing
ds.setSoTimeout(100000);
ds.receive(dp);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ds != null) {
ds.close();
}
}
}
不能在主(UI)线程的Activity
中调用DatagramSocket.receive()
。此方法将阻塞,直到数据可用。这将阻止主(UI)线程,你的应用程序将被安卓系统用ANR(应用程序未响应)杀死。
我认为这两个项目表现不同的原因是,您从web下载的项目可能在清单中指定了较低的android:targetSdkVersion
。如果该项目阻塞的时间足够长,它也将被ANR扼杀。您的项目可能具有更高的android:targetSdkVersion
,因此您会立即得到一个异常,因为您正在主(UI)线程上执行网络I/O。此异常是在更新版本的SDK(API 11级、Android 3.0、Honeycomb)中添加的。
请参阅http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html