Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Runnable被阻止了,为什么会发生这种情况?安卓_Android_Multithreading - Fatal编程技术网

Android Runnable被阻止了,为什么会发生这种情况?安卓

Android Runnable被阻止了,为什么会发生这种情况?安卓,android,multithreading,Android,Multithreading,我正在用谷歌眼镜制作一个室内导航应用程序。我正在将谷歌眼镜上的方位数据发送到安卓手机true WIFI(插座)。我的代码运行正常,但大约25秒后,接收线程(在手机上)停止5秒,然后继续,这非常烦人 我通过关闭连接(当我看到线程变得无响应时)对此进行了测试,调试器需要5秒钟才能到达我在应用程序中设置的断点(显然这是导致问题的线程) 奇怪的是UI线程仍然是响应的,我可以移动活动中的每个对象,只是包含连接(套接字)的特定线程被阻塞了。我会发布代码(我怀疑内存泄漏),这样也许有人可以告诉我为什么会发生这

我正在用谷歌眼镜制作一个室内导航应用程序。我正在将谷歌眼镜上的方位数据发送到安卓手机true WIFI(插座)。我的代码运行正常,但大约25秒后,接收线程(在手机上)停止5秒,然后继续,这非常烦人

我通过关闭连接(当我看到线程变得无响应时)对此进行了测试,调试器需要5秒钟才能到达我在应用程序中设置的断点(显然这是导致问题的线程)

奇怪的是UI线程仍然是响应的,我可以移动活动中的每个对象,只是包含连接(套接字)的特定线程被阻塞了。我会发布代码(我怀疑内存泄漏),这样也许有人可以告诉我为什么会发生这种情况,欢迎任何建议

注释后更改代码:

public class GlassOrientationSocket implements Runnable {
private final static int PORT = 6604;
private static Socket mClientSocket;
private static String mResult;
private static Handler handler = null;
private static boolean threadIsRunning;
private static BufferedReader inputReader;

public GlassOrientationSocket(Handler handler) {
    this.handler = handler;
    this.threadIsRunning = true;
}
public void terminateThread() {this.threadIsRunning = false;}

@SuppressWarnings("deprecation")
@Override
public  void run() {
    //Replace this with ip-address of android server (aka Google glass) // put ip on NFC TAG for easier configuration
    String ServerIP = SECRET;
    //port should be same as ServerSocketActivity
    try {
        mClientSocket = new Socket(serverIP, PORT);
        inputReader = new BufferedReader(new InputStreamReader(mClientSocket.getInputStream()));
        int angleCutter;
        int orientationCutter;
        float[] results = new float[2];

        while(threadIsRunning)
        {
            if (((mResult = inputReader.readLine()) != null)) {
                angleCutter = mResult.indexOf("|", 0);
                orientationCutter = mResult.indexOf("|", angleCutter + 1);
                results[0] = Float.valueOf(mResult.substring(0, angleCutter));
                results[1] = Float.valueOf(mResult.substring(angleCutter + 1, orientationCutter));
                Message msg = new Message();
                msg.arg1 = 1;
                msg.obj = results;
                handler.sendMessage(msg);
            } else {
                if (mClientSocket != null) mClientSocket.close();
                Message msg = new Message();
                msg.arg1 = 2;
                handler.sendMessage(msg);
                threadIsRunning = false;
            }
        }

    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
 }}
////

公共类CompassMonitor{
静态保护的ArrayList侦听器=新建ArrayList();
静态保护玻璃方向插座监视器=空;
私有静态处理程序msgHandler=新处理程序();
私有静态CompassListener定向Listener;
私有静态浮点[]返回的数据=新浮点[2];
静态公共同步无效注册表侦听器(上下文上下文,CompassListener侦听器){
if(listeners.size()==0){
定向侦听器=侦听器;
监视器=新的GlassOrientionSocket(msgHandler=新处理程序(){
@凌驾
公共无效handleMessage(消息消息消息){
开关(消息arg1){
案例1:
dataReturned=(float[])msg.obj;
notifyListeners(dataReturned[0],dataReturned[1],“无用参数”);
打破
案例2:
取消注册侦听器(定向侦听器);
monitor.terminateThread();
}
}
});
螺纹t=新螺纹(监视器);
t、 start();
}
添加(侦听器);
}
静态同步公共void注销侦听器(CompassListener侦听器){
if(侦听器!=null&&listener!=null)
删除(侦听器);
}
静态同步侦听器(浮动方位角、浮动角度、字符串方向){
for(CompassListener l:侦听器){
试一试{
l、 onCompassChanged(方位角、角度、方向);
}捕获(例外情况除外){}
}
}}

您每秒发送多少(更多或更少)条消息?大约是每秒4条消息。我知道最好在线程循环之外创建消息对象,但这不起作用。我无法使此代码与消息对象一起工作。(也就是说,不要每次我想发送一条新消息时都创建新消息)嗯,我以为你每秒发送数千条。。。但是仍然使用Message.get(Handler,int,Object)或Handler.obtainMessage(int,Object),其中Object是例如float[]什么减少了内存使用(而不是Bundle)我这样做了,并将代码更改为每秒运行20次。同样的事情还在发生。它完美地运行了大约20秒,然后被阻塞了3秒。。。。唉。我可以用玻璃制作一个视频来显示问题。这能帮你帮我吗?如果这是玻璃特有的问题,那么很抱歉,但我对此没有任何经验。。。你能找到它被封锁的地方吗?读插座的时候?在readLine之前和之后尝试一些Log.d
public class CompassMonitor {

static protected ArrayList<CompassListener> listeners=new ArrayList<CompassListener>();

static protected GlassOrientationSocket monitor=null;

private static Handler msgHandler = new Handler();
private static CompassListener orientationListener;
private static float[] dataReturned = new float[2];

static public synchronized void registerListener(Context context,CompassListener listener){
    if(listeners.size()==0){
        orientationListener = listener;
        monitor=new GlassOrientationSocket(msgHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.arg1) {
                    case 1:
                        dataReturned = (float[])msg.obj;
                        notifyListeners(dataReturned[0],dataReturned[1],"Useless Parameter");
                    break;
                    case 2:
                        unregisterListener(orientationListener);
                        monitor.terminateThread();
                }

            }
        });
        Thread t = new Thread(monitor);
        t.start();
    }
    listeners.add(listener);
}

static synchronized public void unregisterListener(CompassListener listener){
    if (listeners != null && listener != null)
        listeners.remove(listener);
}

static synchronized protected void notifyListeners(float azimuth,float angle, String direction){
    for(CompassListener l:listeners){
        try{
            l.onCompassChanged(azimuth,angle,direction);
        }catch(Exception ex){}
    }
}}