Android Listener会中断Listener

时间:2014-07-23 16:37:42

标签: android listener interrupt

我正在进行远程控制。有一辆车,它有伺服+ esc,它们连接到arduino,连接到wifi屏蔽。 另一方面,我有Android平板电脑,它发送数据到arduino控制一辆车。 Android app有一个源代码:

package rccardriver.app;

import android.widget.Button;
import android.widget.SeekBar;
import java.net.Socket;
import java.net.UnknownHostException;
import java.io.IOException;
import android.os.AsyncTask;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import java.io.DataOutputStream;



public class MainActivity extends Activity {

    private Socket socket=null;
    private SeekBar steeringControl = null;
    private SeekBar speedControl = null;
    private Button btn=null;
    DataOutputStream DOS = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn=(Button)findViewById(R.id.button);
        btn.setOnClickListener(buttonConnectOnClickListener);
        steeringControl =(SeekBar)findViewById(R.id.steering_bar);
        speedControl =(SeekBar)findViewById(R.id.speed_bar);
        steeringControl.setMax(75);
        speedControl.setMax(180);
        speedControl.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                try {
                    DOS.write(0x01);
                    DOS.write((byte)(speedControl.getProgress()+3));
                } catch (IOException e) {
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                speedControl.setProgress(84);
            }
        });
        steeringControl.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                try {
                    DOS.write(0x00);
                    DOS.write((byte)(steeringControl.getProgress()+3));
                } catch (IOException e) {
                    // TODO Auto-generated catch block
      //              e.printStackTrace();
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                steeringControl.setProgress(35);
            }
        });

        MyClientTask myClientTask = new MyClientTask("192.168.12.101", 8899);
        myClientTask.execute();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    View.OnClickListener buttonConnectOnClickListener =
            new View.OnClickListener(){

                @Override
                public void onClick(View arg0) {
                    try {
                        DOS.write(0x02);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
          //              e.printStackTrace();
                    }
                }};

    public class MyClientTask extends AsyncTask<Void, Void, Void> {

        String dstAddress;
        int dstPort;
        MyClientTask(String addr, int port){
            dstAddress = addr;
            dstPort = port;
        }

        @Override
        protected Void doInBackground(Void... arg0) {
            try {
                socket = new Socket(dstAddress, dstPort);
                DOS = new DataOutputStream(socket.getOutputStream());
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
   //             e.printStackTrace();
    //            response = "UnknownHostException: " + e.toString();
            } catch (IOException e) {
                // TODO Auto-generated catch block
     //           e.printStackTrace();
     //           response = "IOException: " + e.toString();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
     //       textResponse.setText(response);
            super.onPostExecute(result);
        }

    }
}

App有两个搜索栏和一个按钮。 Seekbars控制转向和速度。按钮控制中断。当每个这些对象都有自己的监听器时。当我触摸任何这些对象时,会调用侦听器,它会发送两个字节:第一个字节代表nr命令,第二个字节代表值。 问题是当我不断触摸对象时,最近调用的侦听器会被下一个被调用的侦听器中断。所以arduino接收随机字节。 任何人都知道如何解决这个问题? 如何让听众完全完成?

1 个答案:

答案 0 :(得分:0)

抱歉让你退后一步。你可以按照以下方式进行。

首先确保回调函数确实被中断。通过捕获写入DOS的数据来验证这一点。您可以通过使用FileOutputStream而不是socket.getOutputStream构建DOS来实现此目的。现在,所有DOS次写入调用都会将数据写入文件。

运行你的应用程序 - 做一些快速的UI活动 - 拉动文件 - 验证写入是否真的是随机顺序。要简化验证问题,请仅写入固定的已知滑块进度值而不是实际值。这将使您的生活变得容易识别命令与值。

请发布结果。如果问题仍然存在(它不应该 :)),我们将同步DOS写入调用。