不同项目中相同功能的奇怪,不同结果

时间:2013-12-01 16:55:43

标签: android udp

UdpServer活动来自 Web 下载的项目,而 Mainacitivity 来自我创建的项目。当我逐步执行ds.receive runUdpServer UdpServer activity内的代码ds.receive时运行正常,等待数据进入的问题。

然而MainActivity(my created project)当我ds.receivepublic 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}}

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