Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在Android中使用网络服务发现的内部错误大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在使用示例和 tutorial on the developer page首次实施NSDManager期间,应用程序成功启动了发现并找到了设备.

然而现在它似乎被打破了……

程序启动后,在初始化后,代码进入以下方法并成功运行:

public void discoverservices() {
    Log.d(tag,"Initializing discovery on NSD");
    mNsdManager.discoverservices(
            serviCE_TYPE,NsdManager.PROTOCOL_DNS_SD,mDiscoveryListener);
}

收到日志消息.经过一段时间(约5分钟),这是从程序输出

05-21 11:08:32.518: E/NsdCamera(12236): Discovery Failed: Error code:0
05-21 11:08:32.518: W/dalvikvm(12236): threadid=12: thread exiTing with uncaught exception (group=0x40c9c930)
05-21 11:08:32.518: E/AndroidRuntime(12236): FATAL EXCEPTION: NsdManager
05-21 11:08:32.518: E/AndroidRuntime(12236): java.lang.NullPointerException
05-21 11:08:32.518: E/AndroidRuntime(12236):    at android.net.nsd.NsdManager$serviceHandler.handlemessage(NsdManager.java:338)
05-21 11:08:32.518: E/AndroidRuntime(12236):    at android.os.Handler.dispatchmessage(Handler.java:99)
05-21 11:08:32.518: E/AndroidRuntime(12236):    at android.os.Looper.loop(Looper.java:137)
05-21 11:08:32.518: E/AndroidRuntime(12236):    at android.os.HandlerThread.run(HandlerThread.java:60)

还来自服务:

05-21 11:50:49.108: E/NativeDaemonConnector.ResponseQueue(8858): Timeout waiTing for response
05-21 11:50:49.108: E/mDnsConnector(8858): timed-out waiTing for response to 10 mdnssd discover 6 _http._tcp.
05-21 11:50:49.108: E/Nsdservice(8858): Failed to discoverservices com.android.server.NativeDaemonConnector$NativeDaemonFailureException: command '10 mdnssd discover 6 _http._tcp.' Failed with 'null'

错误代码“0”在NSDManager class中描述为内部错误.
我做的主要更新是访问名为NsdCamera的Helper类中的上下文.
这里有一些可能是邪恶的代码片段:

助手级构造函数

public NsdCamera(CameraChooseActivity context) {
    mContext = context;
    updateUI =  new updateUI();
    mNsdManager = (NsdManager) context.getSystemservice(Context.NSD_serviCE);
    mservicename = new Vector<NsdserviceInfo>();

Helper级NSD初始化:

public void initializeNsd() {
    initializeDiscoveryListener();
}

public void initializeDiscoveryListener() {
    mDiscoveryListener = new NsdManager.DiscoveryListener() {

        @Override
        public void onDiscoveryStarted(String regTypE) {
            Log.d(tag,"service discovery started");
        }
        /**
         * A name check to see if the DNS discovery was correct. checks if it contains 
         * AXIS and has the desired MAC address-space
         * @param hostname,the inputted hostname from the discovery cycle
         * @return true if it's an Axis camera. 
         */
        public Boolean namecheck(String hostName){
            return (hostname.contains("AXIS") && hostname.contains("00408C"));

        }
        @Override
        public void onserviceFound(NsdserviceInfo servicE) {
            Log.d(tag,"service discovery success: " + service.getservicename());
            if (!service.getserviCEType().equals(serviCE_TYPE)) {
                Log.d(tag,"UnkNown service Type: " + service.getserviCEType());
            } else if (namecheck(service.getservicename())){
                mservicename.add(servicE);
//                  updateUI.execute(new BundleUI(mContext,service,null));
            }
        }

        @Override
        public void onserviceLost(NsdserviceInfo servicE) {
            Log.e(tag,"service lost" + servicE);
            if(mservicename.remove(servicE)){
                //TODO
                Log.e(tag,"remove the view,service is lost");
            }
        }

        @Override
        public void onDiscoveryStopped(String serviCETypE) {
            Log.i(tag,"Discovery stopped: " + serviCETypE);
            //Necessary??
            mservicename.clear();
        }

        @Override
        public void onStartDiscoveryFailed(String serviCEType,int errorCodE) {
            Log.e(tag,"Discovery Failed: Error code:" + errorCodE);
            mNsdManager.stopserviceDiscovery(this);
        }

        @Override
        public void onStopDiscoveryFailed(String serviCEType,"Discovery Failed: Error code:" + errorCodE);
            mNsdManager.stopserviceDiscovery(this);
        }
    };
}

CameraChooseActivity – > onCreate正在调用Helper-class

protected void onCreate(Bundle savedInstanceStatE) {
    super.onCreate(savedInstanceStatE);
    setContentView(R.layout.activity_camerachoosE);

    //Setup the animation for the text in the Relativelayout
    mDescription = (TextSwitcher) findViewById(R.id.camera_add);
    mDescription.setFactory(this);
    mDescription.seTinAnimation(AnimationUtils.loadAnimation(this,android.R.anim.fade_in));
    mDescription.setOutAnimation(AnimationUtils.loadAnimation(this,android.R.anim.fade_out));
    mDescription.setText(getText(R.String.camera_add));

    //Building alert dialog
    mBuilder = new AlertDialog.builder(this,AlertDialog.THEME_HOLO_DARK);
    mBuilder.setmessage(R.String.dialog_about).settitle(R.String.action_about);
    mBuilder.setIcon(android.R.drawable.ic_dialog_info);

    mLayout = (RelativeLayout) findViewById(R.id.layout_camerachoosE);

    //Initialize the NSD
    mNSDHelper = new NsdCamera(this);
    mNSDHelper.initializeNsd();

解决方法

根据我的经验,我认为这是一个听众终身问题.

因为您为系统NSD服务提供了两个侦听器,一个用于startserviceDiscovery(),另一个用于stopserviceDiscovery().当系统访问这些侦听器时,您需要确保这些侦听器仍处于活动状态.

一个事实是,在调用startserviceDiscovery()2分钟后调用onStartDiscoveryFailed(),与侦听器的生命周期相比,它应该是一个很长的时间.

因此,如果侦听器是本地对象并在调用startserviceDiscovery()之后释放,则可能导致NSD服务崩溃.

并在下面的代码段确保不要调用任何NsdManager api.

@Override
public void onStartDiscoveryFailed(String serviCEType,int errorCodE) {
     Log.i(tag,"onStartDiscoveryFailed : Error code:" + errorCodE);
}

@Override
public void onStopDiscoveryFailed(String serviCEType,int errorCodE) {
    Log.i(tag,"onStopDiscoveryFailed : Error code:" + errorCodE);
}

祝好运.

大佬总结

以上是大佬教程为你收集整理的在Android中使用网络服务发现的内部错误全部内容,希望文章能够帮你解决在Android中使用网络服务发现的内部错误所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。