小编use*_*350的帖子

ANR与阻塞的HeapTaskDaemon线程

我的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)

java multithreading android

32
推荐指数
1
解决办法
3758
查看次数

Android获取热点提供设备的IP地址

我正在使用

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地址?

感谢和问候

ip networking android wifimanager android-wifi

16
推荐指数
4
解决办法
6万
查看次数

锁定屏幕后调用Android onCreate

当我的应用程序在"顶部"运行时锁定屏幕时,系统几乎立即调用onCreate(屏幕仍为黑色).这种破坏性行为可能是什么原因?

lifecycle android locking oncreate android-lifecycle

10
推荐指数
2
解决办法
2693
查看次数

Android在托管热点时查找设备的IP地址

我需要在托管热点时找到设备的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 ip-address wifi android-networking android-wifi

10
推荐指数
2
解决办法
2万
查看次数

Android保存每次运行崩溃报告的日志

我正在开发一个Android应用程序.我注意到一个非常罕见的错误,导致我的应用程序崩溃.不幸的是,我的智能手机在发生时从未连接到我的电脑.那么,有没有办法在我的应用程序启动时自动将所有日志(尤其是抛出的runtimeexceptions)保存到文件中,以便我可以将此文件复制到我的电脑并分析错误?应用程序的每次启动都应该覆盖该文件,以便它只包含上次运行的日志...我该如何实现?

问候

android crash-reports logcat android-logcat

9
推荐指数
1
解决办法
1万
查看次数

阻止ProgressDialog被onClick解雇

我使用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

5
推荐指数
1
解决办法
1711
查看次数

Android上的UDP打孔; UDP服务器

我正在尝试在Android上为我的udp服务器实现udp打孔.事情应该像这样:

  1. 客户端(在nat之后;可能是3G,...)向服务器发送DatagramPacket(服务器具有公共IP;端口也称为45555).客户端重复发送具有给定延迟的数据报
  2. 一旦服务器收到数据报,它就会每隔500毫秒发回一次数据报("信号").
  3. 如果打孔工作,客户应该接收这些信号

这是我当前的客户端实现(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)

java android udp network-programming hole-punching

5
推荐指数
1
解决办法
1380
查看次数

在Ubuntu上打开项目时,Android Studio会冻结

每当我启动Android Studio并单击"打开现有项目"时,文件浏览器就会打开,但整个应用程序会立即冻结.我使用Android Studio 3.1.3和Ubuntu 16.04.

这个错误的原因是什么?

java android android-studio ubuntu-16.04 android-studio-3.0

5
推荐指数
2
解决办法
1771
查看次数

Android在启用热点的设备上发送UDP广播

在我的应用中,我想广播一些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

android udp broadcast wifi android-networking

2
推荐指数
1
解决办法
3599
查看次数

Android强调整个textView

是否可以为整个textView(layout_width = fill_parent)加下划线而不仅仅是文本?编辑:TextView的文本应该像一种标题.所以我在标题下面有这个标题和文字.为了清楚地分开这两个部分,我想在标题正下方有一条线,它穿过布局的整个宽度.当header-textView的宽度设置为fill_parent时,整个textView应加下划线而不仅仅是其文本.

问候

android textview

1
推荐指数
1
解决办法
1886
查看次数

pthread_create:无法分配内存

我写了一个小的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这个).那么哪里出错了?

c sockets linux pthreads

0
推荐指数
1
解决办法
1995
查看次数