2015-09-06 45 views
1

鏈接到3 java文件: https://www.dropbox.com/s/f57xwvm3gu9eubm/macnetworknotify.rar?dl=0Discover按鈕IllegalStateException異常:無法執行方法的活動

我想執行的http://developer.android.com/training/connect-devices-wirelessly/nsd.html#discover約NSD發現這個應用實例。當我執行它時,它說它不能執行活動的方法,當我點擊'發現'按鈕時。所有其他按鈕都沒有問題。

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)

聽衆....不能爲null。無法用於活動的服務發現。

+0

那也許是因爲它沒有發現任何其他設備(這就是它想要做的),並因此崩潰?只是問,因爲當我在臉書裏找不到任何人時,我有類似的碰撞體驗。 – MOTIVECODEX

+0

@ F4LLCON我不這麼認爲,問題可能是因爲你多次調用'discoverServices()'或者在應用程序的其他地方使用'mDiscoveryListener'。在調用'stopServiceDiscovery(NsdManager.DiscoveryListener)'方法之前,您不能重用偵聽器。 – Titus

+0

我不認爲我在其他地方調用discoveryServices(),也不在其他地方使用mDiscoveryListener ..我已經將Java文件添加到了我的保管箱中。鏈接是在我的問題開始處 – MOTIVECODEX

0

您是否設法使其工作,以及如何在發現之前添加檢查標誌?

boolean isListenerUsed = false; 

和:

if (isListenerUsed == false) { 
     isListenerUsed = true; 
     mNsdManager.discoverServices(
       SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener); 
} 
相關問題