UdpServer活动来自 Web 下载的项目,而 Mainacitivity 来自我创建的项目。当我逐步执行ds.receive
runUdpServer
UdpServer activity
内的代码ds.receive
时运行正常,等待数据进入的问题。
然而MainActivity(my created project)
当我ds.receive
步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();
}
}
}
时,它立即转到错误最终阻止,(无法找到源问题)并解除分配。
为什么2个不同的行为对于相同的代码穿孔。我不知道下载版本 UdpServer活动中的一些隐藏属性,使其能够成功运行并失败。
{{1}}
答案 0 :(得分:1)
您无法在主(UI)主题上的DatagramSocket.receive()
中调用Activity
。此方法将阻塞,直到数据可用。这将阻止主(UI)线程,Android将使用ANR(应用程序无响应)杀死您的应用程序。
我认为2个项目行为不同的原因是您从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