陷入循环,冻结Android应用程序

时间:2015-04-09 09:40:27

标签: java android multithreading freeze

我发现当我按下按钮运行while循环时,虽然程序可以运行,但Android应用程序会冻结。看起来我陷入了循环,我想创建一个线程来显示GUI,另一个用于显示主代码。我是java的新手,我是自学的,所以如果有人能给我一个例子来防止应用冻结,我会很感激。

如果我没有很好地解释我的问题,我很抱歉。

谢谢

这是我的代码

public class TachoCount extends Thread {
public boolean isConnected;
protected static final String TAG = "TachoCount";


NXTConnector conn;
//_message = (TextView) findViewById(R.id.messageText);
//final TextView textView = (TextView) findViewById(R.id.textView1);

public static NXTConnector connect(final CONN_TYPE connection_type) {
    Log.d(TAG, " about to add LEJOS listener ");

    NXTConnector conn = new NXTConnector();
    conn.setDebug(true);
    conn.addLogListener(new NXTCommLogListener() {

        public void logEvent(String arg0) {
            Log.e(TAG + " NXJ log:", arg0);
        }

        public void logEvent(Throwable arg0) {
            Log.e(TAG + " NXJ log:", arg0.getMessage(), arg0);
        }
    });

    switch (connection_type) {
        case LEGO_LCP:
            conn.connectTo("btspp://NXT", NXTComm.LCP);
            break;
        case LEJOS_PACKET:
            conn.connectTo("btspp://");
            break;
    }

    return conn;

}

public TachoCount() {

}




public void closeConnection() {
    try {
        Log.d(TAG, "TachoCount run loop finished and closing");
        conn.getNXTComm().close();
    } catch (Exception e) {
    } finally {

        conn = null;
    }

}

public void establishConnection(){
    conn = TachoCount.connect(CONN_TYPE.LEGO_LCP);
    NXTCommand.getSingleton().setNXTComm(conn.getNXTComm());
    NXTInfo info = conn.getNXTInfo();
    if (info.connectionState== NXTConnectionState.LCP_CONNECTED)
    {
        isConnected = true;
        // set 
        //textView.setText("NXT is here");
    }

}

public void forward(){

    Motor.A.setSpeed(300);
    Motor.C.setSpeed(300);
    Motor.A.forward();
    Motor.C.forward();

}

public void backward(){
    Motor.A.setSpeed(300);
    Motor.C.setSpeed(300);
    Motor.A.backward();
    Motor.C.backward();

}

public void byebye(){
    Motor.A.stop();
    Motor.C.stop();


}


public int getSensorValue()
{
    int val = 0;
    LightSensor ls = new LightSensor(SensorPort.S3);
    val = ls.readValue();
    return val;

}

public void linefollower()
{
    run();
}

public void run()
{   

    int  min = 30, max = 37, readLight = 0, Mspeed = 90, Mspeed2 = 20;
        LightSensor ls = new LightSensor(SensorPort.S3);


        while(true){


                Motor.A.forward();
                Motor.C.forward();

                readLight = ls.readValue();
                LeJOSDroid.sendMessageToUIThread("Sensor: "+ls.readValue());

                if (readLight < min){
                readLight = min+1;
                }

                if (max < readLight){
                readLight = max-1;
                }

                    Motor.C.setSpeed(Mspeed + (Mspeed2 * (readLight - min)));
                    Motor.A.setSpeed(Mspeed + (Mspeed2 * (max - readLight)));   


        }
}
  

我试图更改代码。它运行良好(虽然阅读   传感器似乎不准确),但是当我按下另一个按钮时,   没有任何反应

public void linefollower()
{
    Thread thread = new Thread(runnable);
    thread.start();
}


Runnable runnable = new Runnable ()
{   
    public void run(){
    int  min = 30, max = 37, readLight = 0, Mspeed = 90, Mspeed2 = 20;
        LightSensor ls = new LightSensor(SensorPort.S3);


        while(true){


                Motor.A.forward();
                Motor.C.forward();

                readLight = ls.readValue();
                LeJOSDroid.sendMessageToUIThread("Sensor: "+ls.readValue());

                if (readLight < min){
                readLight = min+1;
                }

                if (max < readLight){
                readLight = max-1;
                }

                    Motor.C.setSpeed(Mspeed + (Mspeed2 * (readLight - min)));
                    Motor.A.setSpeed(Mspeed + (Mspeed2 * (max - readLight)));       

        }

    }



};

2 个答案:

答案 0 :(得分:-1)

尝试使用Runnable或后台工作程序

答案 1 :(得分:-1)

你的循环看起来无限,它总是如此。此外,在asynctask活动中执行繁重的任务可能更好。

查看官方信息:http://developer.android.com/reference/android/os/AsyncTask.html