2015-09-06 4 views
1

Ссылка на 3 файлов Java: https://www.dropbox.com/s/f57xwvm3gu9eubm/macnetworknotify.rar?dl=0кнопку Discover IllegalStateException: Не удалось выполнить метод деятельности

Я пытаюсь выполнить этот пример приложения найти на http://developer.android.com/training/connect-devices-wirelessly/nsd.html#discover о НРД. Когда я его запускаю, он говорит, что не может выполнить метод активности, когда я нажимаю кнопку «открыть». У всех других кнопок нет проблем.

09-06 17:16:10.430 13489-13489/? E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.motivecodex.macnetworknotify, PID: 13489 
    java.lang.IllegalStateException: Could not execute method of the activity 
      at android.view.View$1.onClick(View.java:4253) 
      at android.view.View.performClick(View.java:5197) 
      at android.view.View$PerformClick.run(View.java:20926) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:145) 
      at android.app.ActivityThread.main(ActivityThread.java:5942) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195) 
    Caused by: java.lang.reflect.InvocationTargetException 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at android.view.View$1.onClick(View.java:4248) 
            at android.view.View.performClick(View.java:5197) 
            at android.view.View$PerformClick.run(View.java:20926) 
            at android.os.Handler.handleCallback(Handler.java:739) 
            at android.os.Handler.dispatchMessage(Handler.java:95) 
            at android.os.Looper.loop(Looper.java:145) 
            at android.app.ActivityThread.main(ActivityThread.java:5942) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195) 
    Caused by: java.lang.IllegalArgumentException: listener already in use 
      at android.net.nsd.NsdManager.discoverServices(NsdManager.java:559) 
      at com.motivecodex.macnetworknotify.NsdHelper.discoverServices(NsdHelper.java:141) 
      at com.motivecodex.macnetworknotify.MainActivity.clickDiscover(MainActivity.java:58) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at android.view.View$1.onClick(View.java:4248) 
            at android.view.View.performClick(View.java:5197) 
            at android.view.View$PerformClick.run(View.java:20926) 
            at android.os.Handler.handleCallback(Handler.java:739) 
            at android.os.Handler.dispatchMessage(Handler.java:95) 
            at android.os.Looper.loop(Looper.java:145) 
            at android.app.ActivityThread.main(ActivityThread.java:5942) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195) 

Какой-то код, я думаю, может помочь решить проблему, я действительно не знаю или не могу найти проблему.

activity_main.xml

<Button 
android:id="@+id/discover_btn" 
android:layout_width="96dp" 
android:layout_height="64dp" 
android:onClick="clickDiscover" 
android:text="@string/discover" /> 

MainActivity.java

public void clickDiscover(View v) { 
     mNsdHelper.discoverServices(); 
    } 

@Override 
    protected void onResume() { 
     super.onResume(); 
     if (mNsdHelper != null) { 
      mNsdHelper.discoverServices(); 
     } 
    } 

NsdHelper.java

public void discoverServices() { 
     mNsdManager.discoverServices(
       SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener); 
    } 

public void stopDiscovery() { 
     mNsdManager.stopServiceDiscovery(mDiscoveryListener); 
    } 

И, когда я открываю NsdManager.java, где discoveryServices и NsdManager расположены, Я вижу много ошибок, начиная с импорта, не может разрешить SdkConstant и AsyncChannel и Протокол, а затем много эров в коде. Это нормально? Это вызывает крах?

ответ

1

Проблема связана с вызовом метода discoverServices(...), вы повторно используете прослушиватель mDiscoveryListener.

public void discoverServices (String serviceType, int protocolType, NsdManager.DiscoveryListener listener)

слушатель .... Не может быть нулевым. Не может быть использован для активного обнаружения службы.

+0

это может быть, что он не обнаруживает каких-либо другое устройство (это то, что он хочет сделать) и падает поэтому? Просто спрашиваю, потому что у меня был подобный случай крушения, когда я не мог найти никого в facebook. – MOTIVECODEX

+0

@ F4LLCON Я так не думаю, проблема может быть причиной, потому что вы вызываете 'discoverServices()' более одного раза или используете 'mDiscoveryListener' где-то еще в своем приложении. Вы не можете повторно использовать прослушиватель, пока не вызовете метод 'stopServiceDiscovery (NsdManager.DiscoveryListener). – Titus

+0

Я не думаю, что я вызываю findServices() где-то в другом месте, а также не использую mDiscoveryListener где-нибудь еще. Я добавил файлы Java в мой Dropbox. Ссылка находится в начале моего вопроса – MOTIVECODEX

0

Удалось ли вам сработать, и как насчет добавления флага проверки перед обнаружением?

boolean isListenerUsed = false; 

И:

if (isListenerUsed == false) { 
     isListenerUsed = true; 
     mNsdManager.discoverServices(
       SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener); 
} 
Смежные вопросы