android nsd和udp广播,android - 调用resolveService时,NSD在DiscoveryListener回调中缺少NSDManager - 堆栈内存溢出...
我想在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 - 堆栈内存溢出...相关推荐
- android nsd和udp广播,Android网络服务发现(NSD)使用
Android网络服务发现(NSD)使用 NSD(NsdManager)是Android SDK中自带的类库,可以集成直接使用. 使用 NSD服务需要(android4.1及以上) minSdkVer ...
- android su 没有权限,android - 无法在需要SU权限的Termux中执行脚本 - 堆栈内存溢出...
因此,我通常不发布信息,而是花费数小时在论坛上拖网寻找答案-但我完全不知所措. 我想做的事: 真的很简单,我想要一个可以自动更改OnePlus 5上MAC地址的脚本,我已经拥有执行此命令所需的所有命令 ...
- android tmp目录权限不够,android - 使用root用户安装APK,处理“ / data / local / tmp /”文件夹的新限制 - 堆栈内存溢出...
背景 到目前为止,我可以通过以下代码使用root(在应用程序内)安装APK文件: pm install -t -f fullPathToApkFile 并且如果我想(尝试)安装到sd-card: pm ...
- android和flask交互,java - 当我从Android向Flask Web服务发送参数时,如何解决“ SSL库故障”? - 堆栈内存溢出...
我确实尝试将一些值作为" application / json "从Android应用程序发送到Flask Web服务. 这是我的Java代码 : Thread thread = ...
- 组件文件已损坏或android内部模块,android - Android Q更新后,模块化系统组件在托管配置文件中不可用 - 堆栈内存溢出...
在从工作配置文件配置的设备设置应用中将操作系统从Android 9升级到10后,请停止运行. java.lang.RuntimeException: Unable to start activity ...
- android计步器摘要,ios - Healthkit每小时活动摘要包含步数,距离和卡路里? - 堆栈内存溢出...
查询Healthkit应返回包含步长,距离和卡路里的数组对象. 我能够单独归还他们 活动步骤/小时 func activitySteps(_ startDate:NSDate, endDate:NSD ...
- c 传图片数据给matlab,c++ - 如何通过UDP将数据从C ++应用程序发送到Matlab并进行绘制 - 堆栈内存溢出...
我想使用Winsock通过UDP将数据从我的C ++应用程序发送到Matlab,并实时绘制数字. 例如:我得到了从1到10的数字,我想从C ++发送1,在Matlab中接收它,将其放在图形上(图,条等 ...
- python升级命令出现错误_python - _tkinter.TclError:无法调用“ update”命令:应用程序已被破坏错误 - 堆栈内存溢出...
我同意其他人的看法,您应该在这里使用mainloop() ,但是,如果您想保留原始代码的方式是跟踪布尔值, while x == True . 这样,我们可以将x的值更新为False ,这样就可以避免 ...
- android系统休眠发广播,Android - BroadcastReceiver
BroadcastReceiver BroadcastReceiver,广播接收者,用来接收系统和应用的广播,并做出相应的处理,如电量过低时提示用户充电等: BroadcastReceiver 是 A ...
- Android 通过局域网udp广播自动建立socket连接
Android开发中经常会用到socket通讯.由于项目需要,最近研究了一下这方面的知识. 需求是想通过wifi实现android移动设备和android平台的电视之间的文件传输与控制. 毫无疑问这中 ...
最新文章
- 1-NET UX1000-实战-配置-Lync Server 2010-集成
- 研究者设计了Fastball任务早期诊断阿尔茨海默病
- retrofit 会请求两次_Retrofit2+Rxjava-Rxjava2.x-篇二-依次执行多个请求-flatMap/map
- R语言中级--自定义方程
- 计算机组成原理(一)计算机系统概述
- docker mysql 主从配置
- 方舟手游服务器能修改密码吗,明日方舟怎么改密码_明日方舟改密码方法详细解析一览[多图]...
- 路由器经常掉线,必须重新插拔网线才能上网,什么原因?
- 方型二维码换成圆形_1分钟将微信头像从方形变为圆形
- Trafodion建表之使用多温度特性
- 微pe工具箱是微软的吗_电脑装系统用一键装机好用还是微PE工具箱好用
- 接口 常见视频接口详解
- 《王者荣耀》手游产品分析报告:崛起的王者荣耀,胜负就是这么简单!
- java_web需要哪些技术
- 使用EasyPOI导出复杂的Word表格
- mp3转换器哪个好?教你两种正确转换音频文件的技巧
- 掌握真正科学的学习方法——学会如何学习(Learning How to Learn)课程笔记
- 力扣 560. 和为 K 的子数组
- ibm服务器 t系列,IBMT
- python bootstrap-fileinput示例_文件上传控件bootstrap-fileinput的使用
热门文章
- react native webview 百度地图_react-native-baidu-map使用及注意问题
- java 挂起_Java 6 JVM挂起
- 网络流二十四题之魔术球问题
- 常见的java设计模式
- Service Broadcast简单音乐播放功能
- LeetCode:81. Search in Rotated Sorted Array II
- JQuery中$.ajax()方法参数详解 转载
- 读Thinking in Java(1~4)
- poj 3280 Cheapest Palindrome (dp)
- sql2000海量存储过程(1500w数据,分页只需1秒)