首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android监听器中断监听器

Android监听器中断监听器
EN

Stack Overflow用户
提问于 2014-07-24 00:37:42
回答 1查看 214关注 0票数 0

我在研究远程控制。有一辆车,它有伺服+ esc,它们连接到arduino,arduino连接到wifi屏蔽。另一边是安卓平板电脑,它可以向arduino发送数据来控制汽车。这里有一个android应用的源代码:

代码语言:javascript
复制
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);
        }

    }
}

应用程序有两个搜索栏和一个按钮。Seekbar控制转向和速度。按钮控件断开。当这些对象都有自己的侦听器时。当我接触到这些对象中的任何一个时,监听器就会被调用,它会发送两个字节:第一个字节代表命令的nr,第二个字节代表value。问题是,当我连续触摸对象时,最近调用的listener被下一个调用的listener中断。以便arduino接收随机字节。有谁知道怎么解决这个问题吗?如何让听者完全做到这一点?

EN

回答 1

Stack Overflow用户

发布于 2014-07-24 22:02:06

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

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

运行你的应用-执行一些快速的UI活动-拉取文件-验证写入是否真的是随机顺序的。为了简化验证问题,只写入固定的已知滑块进度值,而不是实际的值。这将使您的工作更容易识别命令与值。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24916167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档