我想在android设备之间交换数据,因此应使用NSD查找其他设备。

服务器设备已在网络上成功注册了该服务,客户端设备识别了该服务并在onServiceFound()上输入了DiscoveryListener回调方法。 然后,我初始化resolveListener并调用resolveService(),但应用程序崩溃,

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.net.nsd.NsdManager.resolveService(android.net.nsd.NsdServiceInfo, android.net.nsd.NsdManager$ResolveListener)' on a null object reference

at de.niklasdahlheimer.oboeapitest.oboeapitest.NSDFinder$1.onServiceFound(NSDFinder.java:59)

at android.net.nsd.NsdManager$ServiceHandler.handleMessage(NsdManager.java:333)

at android.os.Handler.dispatchMessage(Handler.java:102)

at android.os.Looper.loop(Looper.java:154)

at android.os.HandlerThread.run(HandlerThread.java:61)

我的mNsdManager在NSDFinder类中不为null,但在DiscoveryListener的回调方法中以某种方式为null。 似乎我在使用不同的线程时遇到了问题,或者在处理上下文时出现了误解。 我的NSDFinder类应该扩展服务还是什么? 我不希望main-activity中的NSD代码保持结构良好。

(缩短)主要活动

public class MainActivity extends AppCompatActivity {

//Variable Declarations

NSDFinder my_nsdfinder;

@Override

protected void onCreate(Bundle savedInstanceState) {

button_discoverserver =(Button) findViewById(R.id.button_discoverServer);

//Variables Instantiations

my_nsdfinder = new NSDFinder();

button_discoverserver.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

my_nsdfinder.initializeDiscoveryListener();

my_nsdfinder.startDiscovery(getApplicationContext());

Toast.makeText(getApplicationContext(),"Suche nach Servern...",Toast.LENGTH_LONG).show();

}

});

}

}

NSDFinder类(NSDFinder.java)

public class NSDFinder{

String TAG = "NSDFINDER";

NsdManager mNsdManager;

NsdManager.DiscoveryListener mDiscoveryListener;

String mServiceName;

String SERVICE_TYPE = "_http._tcp.";

Context mContext;

int mDiscoveryActive = 0;

FragmentManager m_DialogManager;

NsdManager.ResolveListener mResolveListener;

NsdServiceInfo mService;

int mServiceport;

InetAddress mServicehostAdress;

public void initializeDiscoveryListener() {

// Instantiate a new DiscoveryListener

mDiscoveryListener = new NsdManager.DiscoveryListener() {

// Called as soon as service discovery begins.

@Override

public void onDiscoveryStarted(String regType) {

Log.d(TAG, "Service discovery started");

mDiscoveryActive = 1;

}

@Override

public void onServiceFound(NsdServiceInfo service) {

// A service was found! Do something with it.

Log.d(TAG, "Service discovery success\n" + service);

if (!service.getServiceType().equals(SERVICE_TYPE)) {

// Service type is the string containing the protocol and

// transport layer for this service.

Log.d(TAG, "Unknown Service Type: " + service.getServiceType());

} else if (service.getServiceName().equals(mServiceName)) {

// The name of the service tells the user what they'd be

// connecting to. It could be "Bob's Chat App".

Log.d(TAG, "Same machine: " + mServiceName);

} else if (service.getServiceName().contains("LTCTool")){

Toast.makeText(mContext,"LTCTool Server gefunden! "+service,Toast.LENGTH_LONG).show();

initializeResolveListener();

mNsdManager.resolveService(service,mResolveListener);

//mNsdManager.stopServiceDiscovery(mDiscoveryListener);

}

}

@Override

public void onServiceLost(NsdServiceInfo service) {

// When the network service is no longer available.

// Internal bookkeeping code goes here.

Log.e(TAG, "service lost" + service);

}

@Override

public void onDiscoveryStopped(String serviceType) {

Log.i(TAG, "Discovery stopped: " + serviceType);

mDiscoveryActive = 0;

}

@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, int errorCode) {

Log.e(TAG, "Discovery failed: Error code:" + errorCode);

mNsdManager.stopServiceDiscovery(this);

}

};

}

public void startDiscovery(Context _c){

mContext = _c;

NsdManager mNsdManager = (NsdManager) _c.getSystemService(Context.NSD_SERVICE);

mNsdManager.discoverServices(SERVICE_TYPE, mNsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);

}

public void initializeResolveListener() {

Log.d(TAG, "start initalizing ResolveListener");

mResolveListener = new NsdManager.ResolveListener() {

@Override

public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {

// Called when the resolve fails. Use the error code to debug.

Log.e(TAG, "Resolve failed" + errorCode);

}

@Override

public void onServiceResolved(NsdServiceInfo serviceInfo) {

Log.e(TAG, "Resolve Succeeded. " + serviceInfo);

if (serviceInfo.getServiceName().equals(mServiceName)) {

Log.d(TAG, "Same IP.");

return;

}

mService = serviceInfo;

mServiceport = mService.getPort();

mServicehostAdress = mService.getHost();

Toast.makeText(mContext,"Dienstinformationen aufgelöst! Port: "+mServiceport+" Adresse: "+mServicehostAdress,Toast.LENGTH_LONG).show();

}

};

Log.d(TAG, "ResolveListener initialized");

}

}

android nsd和udp广播,android - 调用resolveService时,NSD在DiscoveryListener回调中缺少NSDManager - 堆栈内存溢出...相关推荐

  1. android nsd和udp广播,Android网络服务发现(NSD)使用

    Android网络服务发现(NSD)使用 NSD(NsdManager)是Android SDK中自带的类库,可以集成直接使用. 使用 NSD服务需要(android4.1及以上) minSdkVer ...

  2. android su 没有权限,android - 无法在需要SU权限的Termux中执行脚本 - 堆栈内存溢出...

    因此,我通常不发布信息,而是花费数小时在论坛上拖网寻找答案-但我完全不知所措. 我想做的事: 真的很简单,我想要一个可以自动更改OnePlus 5上MAC地址的脚本,我已经拥有执行此命令所需的所有命令 ...

  3. android tmp目录权限不够,android - 使用root用户安装APK,处理“ / data / local / tmp /”文件夹的新限制 - 堆栈内存溢出...

    背景 到目前为止,我可以通过以下代码使用root(在应用程序内)安装APK文件: pm install -t -f fullPathToApkFile 并且如果我想(尝试)安装到sd-card: pm ...

  4. android和flask交互,java - 当我从Android向Flask Web服务发送参数时,如何解决“ SSL库故障”? - 堆栈内存溢出...

    我确实尝试将一些值作为" application / json "从Android应用程序发送到Flask Web服务. 这是我的Java代码 : Thread thread = ...

  5. 组件文件已损坏或android内部模块,android - Android Q更新后,模块化系统组件在托管配置文件中不可用 - 堆栈内存溢出...

    在从工作配置文件配置的设备设置应用中将操作系统从Android 9升级到10后,请停止运行. java.lang.RuntimeException: Unable to start activity ...

  6. android计步器摘要,ios - Healthkit每小时活动摘要包含步数,距离和卡路里? - 堆栈内存溢出...

    查询Healthkit应返回包含步长,距离和卡路里的数组对象. 我能够单独归还他们 活动步骤/小时 func activitySteps(_ startDate:NSDate, endDate:NSD ...

  7. c 传图片数据给matlab,c++ - 如何通过UDP将数据从C ++应用程序发送到Matlab并进行绘制 - 堆栈内存溢出...

    我想使用Winsock通过UDP将数据从我的C ++应用程序发送到Matlab,并实时绘制数字. 例如:我得到了从1到10的数字,我想从C ++发送1,在Matlab中接收它,将其放在图形上(图,条等 ...

  8. python升级命令出现错误_python - _tkinter.TclError:无法调用“ update”命令:应用程序已被破坏错误 - 堆栈内存溢出...

    我同意其他人的看法,您应该在这里使用mainloop() ,但是,如果您想保留原始代码的方式是跟踪布尔值, while x == True . 这样,我们可以将x的值更新为False ,这样就可以避免 ...

  9. android系统休眠发广播,Android - BroadcastReceiver

    BroadcastReceiver BroadcastReceiver,广播接收者,用来接收系统和应用的广播,并做出相应的处理,如电量过低时提示用户充电等: BroadcastReceiver 是 A ...

  10. Android 通过局域网udp广播自动建立socket连接

    Android开发中经常会用到socket通讯.由于项目需要,最近研究了一下这方面的知识. 需求是想通过wifi实现android移动设备和android平台的电视之间的文件传输与控制. 毫无疑问这中 ...

最新文章

  1. 1-NET UX1000-实战-配置-Lync Server 2010-集成
  2. 研究者设计了Fastball任务早期诊断阿尔茨海默病
  3. retrofit 会请求两次_Retrofit2+Rxjava-Rxjava2.x-篇二-依次执行多个请求-flatMap/map
  4. R语言中级--自定义方程
  5. 计算机组成原理(一)计算机系统概述
  6. docker mysql 主从配置
  7. 方舟手游服务器能修改密码吗,明日方舟怎么改密码_明日方舟改密码方法详细解析一览[多图]...
  8. 路由器经常掉线,必须重新插拔网线才能上网,什么原因?
  9. 方型二维码换成圆形_1分钟将微信头像从方形变为圆形
  10. Trafodion建表之使用多温度特性
  11. 微pe工具箱是微软的吗_电脑装系统用一键装机好用还是微PE工具箱好用
  12. 接口 常见视频接口详解
  13. 《王者荣耀》手游产品分析报告:崛起的王者荣耀,胜负就是这么简单!
  14. java_web需要哪些技术
  15. 使用EasyPOI导出复杂的Word表格
  16. mp3转换器哪个好?教你两种正确转换音频文件的技巧
  17. 掌握真正科学的学习方法——学会如何学习(Learning How to Learn)课程笔记
  18. 力扣 560. 和为 K 的子数组
  19. ibm服务器 t系列,IBMT
  20. python bootstrap-fileinput示例_文件上传控件bootstrap-fileinput的使用

热门文章

  1. react native webview 百度地图_react-native-baidu-map使用及注意问题
  2. java 挂起_Java 6 JVM挂起
  3. 网络流二十四题之魔术球问题
  4. 常见的java设计模式
  5. Service Broadcast简单音乐播放功能
  6. LeetCode:81. Search in Rotated Sorted Array II
  7. JQuery中$.ajax()方法参数详解 转载
  8. 读Thinking in Java(1~4)
  9. poj 3280 Cheapest Palindrome (dp)
  10. sql2000海量存储过程(1500w数据,分页只需1秒)