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