Runnable被封锁了,为什么会这样? ANDROID

时间:2014-10-20 09:22:23

标签: android multithreading

我正在使用谷歌眼镜制作内部导航应用程序。我将定向数据从谷歌玻璃发送到Android手机真正的WIFI(SOCKETS)。我的代码运行正常并且没问题,但是大约25秒后接收线程(在手机上)停止5秒然后继续,这非常烦人。

我通过关闭连接测试了这一点(当我看到线程无响应时),调试器需要5秒才能达到我在应用程序中设置的断点(显然这是引起问题的线程)< / p>

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

评论后更改的代码:

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();
    }
 }}

////

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){}
    }
}}

0 个答案:

没有答案