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

  • 本文关键字:功能 结果 项目 android udp
  • 更新时间 :
  • 英文 :


UdpServer活动来自从Web下载的项目,Mainactivity则来自我创建的项目。当我在runUdpServer内遍历代码ds.receive时,问题是UdpServer activity运行正常,它正在等待数据进入。

但是ds.receiveMainActivity(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

最新更新