2013-12-01 3 views
0

UdpServer активность от проекта, загруженного из Web и Mainacitivity составляет от проекта я создал. Проблема, когда я пошагово код ds.receive внутри runUdpServer на один UdpServer activity работает ОК, он ждет данных прийти.Одда, разный результат для того же функции в другом проекте

Однако ds.receive внутри MainActivity(my created project), когда я ступаю ds.receive сразу перейти к ошибкам, наконец, блок (неспособный для поиска исходной проблемы) и освобожден.

Почему 2 разных поведения для одного и того же пирса кодов. Я не знаю, какие скрытые свойства внутри загруженной версии Операция 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(); 
      } 
     } 
    } 

ответ

1

Вы не можете позвонить DatagramSocket.receive() в Activity на главном (UI) нити. Этот метод блокируется до тех пор, пока данные не будут доступны. Это блокирует основной поток (UI), и ваше приложение будет убито Android с ANR (приложение не отвечает).

Я предполагаю, что причина, по которой 2 проекта ведут себя по-другому, заключается в том, что проект, который вы загрузили из Интернета, вероятно, имеет низкий android:targetSdkVersion, указанный в манифесте. Этот проект также будет убит с помощью ANR, если он блокируется достаточно долго. Вероятно, ваш проект имеет более высокий android:targetSdkVersion, поэтому вы получаете сразу же исключение, потому что вы делаете сетевой ввод-вывод в основном потоке (UI). Это исключение было добавлено в более поздней версии SDK (уровень API 11, Android 3.0, Honeycomb).

См. http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

Смежные вопросы