【问题标题】:Discover button IllegalStateException: Could not execute method of the activity发现按钮 IllegalStateException:无法执行活动的方法
【发布时间】:2015-09-06 15:36:05
【问题描述】:

链接到 3 个 java 文件: https://www.dropbox.com/s/f57xwvm3gu9eubm/macnetworknotify.rar?dl=0

我正在尝试执行这个在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 所在的 NsdManager.java 时,我看到很多错误,从导入开始说无法解析 SdkConstant 和 AsyncChannel 和协议,然后代码中出现很多错误。这是正常的吗?这是导致崩溃的原因吗?

【问题讨论】:

    标签: java android android-nsd


    【解决方案1】:

    问题似乎是由discoverServices(...) 方法调用引起的,您正在重用mDiscoveryListener 侦听器。

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

    listener .... 不能为空。不能用于活动服务发现。

    【讨论】:

    • 可能是它没有发现任何其他设备(这就是它想要做的)并因此崩溃?只是问一下,因为当我在 facebook 中找不到任何人时,我也有类似的崩溃经历。
    • @F4LLCON 我不这么认为,问题可能是因为您不止一次调用discoverServices(),或者您在应用程序的其他地方使用了mDiscoveryListener。在调用 stopServiceDiscovery(NsdManager.DiscoveryListener) 方法之前,您不能重用监听器。
    • 我认为我没有在其他地方调用discoveryServices(),也没有在其他任何地方使用mDiscoveryListener。我已将Java 文件添加到我的保管箱中。链接在我问题的开头
    • @F4LLCON 您多次调用discoverServices(),它在onResume() 方法和clickDiscover(...) 方法中调用。
    • 我在 MainActivity.java 中调用 NsdHelper 中的 discoveryServices()。所以基本上它被称为一次?该代码实际上来自于此处找到的 Google 示例应用程序 developer.android.com/intl/es/training/…
    【解决方案2】:

    你有没有设法让它工作,在发现之前添加一个检查标志怎么样?

    boolean isListenerUsed = false;
    

    还有:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多