我的Android应用中出现了ANR错误.跟踪仅显示一个处于阻塞状态的线程(所有其他线程处于等待状态,休眠状态,本机状态......),因此它似乎没有处于死锁状态.有两个线程我手动启动(直接),所以我大致知道我的应用程序的哪个部分发生了ANR.不幸的是,我无法理解被阻塞线程的痕迹.也许有人有想法?
被阻止的线程:
"HeapTaskDaemon" daemon prio=5 tid=6 Blocked
| group="system" sCount=1 dsCount=0 obj=0x12cfc8e0 self=0xab4b2bf0
| sysTid=10048 nice=0 cgrp=default sched=0/0 handle=0xf4815930
| state=S schedstat=( 113876044 26950467 98 ) utm=9 stm=2 core=5 HZ=100
| stack=0xf4713000-0xf4715000 stackSize=1038KB
| held mutexes=
native: pc 0000000000016908 /system/lib/libc.so (syscall+28)
native: pc 00000000000f604b /system/lib/libart.so (_ZN3art17ConditionVariable4WaitEPNS_6ThreadE+82)
native: pc 00000000001cddb1 /system/lib/libart.so (_ZN3art2gc13TaskProcessor7GetTaskEPNS_6ThreadE+92)
native: pc 00000000001ce2c5 /system/lib/libart.so (_ZN3art2gc13TaskProcessor11RunAllTasksEPNS_6ThreadE+60)
native: pc 000000000000036f /data/dalvik-cache/arm/system@framework@boot.oat (Java_dalvik_system_VMRuntime_runHeapTasks__+74)
at dalvik.system.VMRuntime.runHeapTasks (Native method)
- waiting to lock an unknown object
at java.lang.Daemons$HeapTaskDaemon.run (Daemons.java:355)
at java.lang.Thread.run (Thread.java:818)
Run Code Online (Sandbox Code Playgroud)
这是主线程:
"main" …Run Code Online (Sandbox Code Playgroud) 我正在使用
public static String getLocalIPAddress(WifiManager wm){
return Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());
}
Run Code Online (Sandbox Code Playgroud)
获取执行设备的IP地址.如果设备连接到"公共"wlan网络,并且设备连接到由其他Android设备通过热点托管的wifi网络,则工作正常.如果设备未连接到任何wifi网络,则返回"0.0.0.0"(正确).但是,如果设备通过提供热点来托管wifi网络,则该方法仍然返回"0.0.0.0".如何在"自己的wifi网络"中获取热点提供设备的真实IP地址?
感谢和问候
当我的应用程序在"顶部"运行时锁定屏幕时,系统几乎立即调用onCreate(屏幕仍为黑色).这种破坏性行为可能是什么原因?
我需要在托管热点时找到设备的IP地址.到目前为止我使用过这段代码:
//if is using Hotspot
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
if (intf.getName().contains("wlan")) {
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress() && (inetAddress.getAddress().length == 4)) {
return inetAddress.getHostAddress();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这工作得很好但是NetworkInterface某些设备上的wifi 名称不同.所以我必须首先找到设备的wifi NetworkInterface名称(针对其热点).我怎么能找到这个名字?或者是否有更好的方法来查找设备的IP地址?
///通过MAC查找正确的IP地址似乎也不起作用
我正在开发一个Android应用程序.我注意到一个非常罕见的错误,导致我的应用程序崩溃.不幸的是,我的智能手机在发生时从未连接到我的电脑.那么,有没有办法在我的应用程序启动时自动将所有日志(尤其是抛出的runtimeexceptions)保存到文件中,以便我可以将此文件复制到我的电脑并分析错误?应用程序的每次启动都应该覆盖该文件,以便它只包含上次运行的日志...我该如何实现?
问候
我使用ProgressDialog向用户显示他必须等待并且在用户必须等待时使我的应用程序的表面"不可触及".我在progressDialog中添加了一个Button,如果某些条件为真,它应该启动一些操作.问题是,每次用户按下按钮时,progressDialog都会自动被解除.即使没有触发任何动作.如何在调用onClick时阻止progressDialog被解雇?
感谢和问候
编辑:
connectingDialog = new ProgressDialog(this);
connectingDialog.setCancelable(false);
connectingDialog.setCanceledOnTouchOutside(false);
connectingDialog.setButton(DialogInterface.BUTTON_NEUTRAL, "start", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface arg0, int arg1) {
/*if(isPrepared)
startGame();*/
connectingDialog.show(); // does not work, too
}
});
connectingDialog.show();
Run Code Online (Sandbox Code Playgroud) android progressdialog android-button android-dialog onclicklistener
我正在尝试在Android上为我的udp服务器实现udp打孔.事情应该像这样:
这是我当前的客户端实现(Android):
//in onCreate()
DatagramSocket socket = new DatagramSocket(46222);
socket.setSoTimeout(2000);
final Thread t = new Thread(new Runnable(){
@Override
public void run() {
int delay = Integer.parseInt(e2.getText().toString());//e1 and e2 are EditTexts
String ip = e1.getText().toString();
try {
DatagramPacket packet = new DatagramPacket(new byte[1],1, InetAddress.getByName(ip), 45555);
while(!cleanUp){//cleanUp is set to true in onPause()
lock.lock(); //Lock lock = new ReentrantLock();
socket.send(packet);
lock.unlock();
Thread.sleep(delay);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(socket!=null)
socket.close();
}
}
});
final Thread t2 = …Run Code Online (Sandbox Code Playgroud) 每当我启动Android Studio并单击"打开现有项目"时,文件浏览器就会打开,但整个应用程序会立即冻结.我使用Android Studio 3.1.3和Ubuntu 16.04.
这个错误的原因是什么?
在我的应用中,我想广播一些UDP数据包。我目前正在使用此方法来获取所需的广播地址:
InetAddress getBroadcastAddress() throws IOException {
WifiManager wifi = mContext.getSystemService(Context.WIFI_SERVICE);
DhcpInfo dhcp = wifi.getDhcpInfo();
// handle null somehow
int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask;
byte[] quads = new byte[4];
for (int k = 0; k < 4; k++)
quads[k] = (byte) ((broadcast >> k * 8) & 0xFF);
return InetAddress.getByAddress(quads);
}
Run Code Online (Sandbox Code Playgroud)
-> https://code.google.com/p/boxeeremote/wiki/AndroidUDP
效果很好,但是如果设备已激活热点并尝试在引发SocketException之后尝试广播数据包:SocketException: sendto failed: ENETUNREACH (Network is unreachable)
如何在“提供”热点的设备上获取正确的广播地址?我尝试过的所有单播地址都运行良好...
问候与问候
PS:最小的SDK是API 8!
是否可以为整个textView(layout_width = fill_parent)加下划线而不仅仅是文本?编辑:TextView的文本应该像一种标题.所以我在标题下面有这个标题和文字.为了清楚地分开这两个部分,我想在标题正下方有一条线,它穿过布局的整个宽度.当header-textView的宽度设置为fill_parent时,整个textView应加下划线而不仅仅是其文本.
问候
我写了一个小的tcp服务器,它为每个传入的连接创建一个新的线程:
while (server_running)
{
client_sock = accept(server_sock,
(struct sockaddr *)&client_name,
&client_name_len);
if(!server_running)
break;
if (client_sock == -1)
continue;
/* accept_request(client_sock); */
if (pthread_create(&newthread , NULL, &accept_request, &client_sock) != 0)
perror("pthread_create");
}
Run Code Online (Sandbox Code Playgroud)
大约380个成功连接后,出现错误消息
'pthread_create:无法分配内存'
每次新的连接尝试都会发生.我真的不知道这来自哪里,因为accept_request运行正常.我还注意到TIME_WAIT在运行期间有很多与状态的连接(我用过netstat这个).那么哪里出错了?
android ×10
java ×3
android-wifi ×2
udp ×2
wifi ×2
broadcast ×1
c ×1
ip ×1
ip-address ×1
lifecycle ×1
linux ×1
locking ×1
logcat ×1
networking ×1
oncreate ×1
pthreads ×1
sockets ×1
textview ×1
ubuntu-16.04 ×1
wifimanager ×1