抱歉我的英文不好, 我正在为学校做一个项目,我必须通过带有Android应用程序的WiFi移动车辆。我实现了我的目标,但我很惊讶地发现,在我按下任何按钮的大部分时间里,我的车辆花了一些时间来实际做某事。另一方面,当我快速按下任何按钮几次,事件堆叠,之后,即使我没有按任何按钮,车辆也会移动。不用说,两者都有几个问题。有没有办法解决它们? Android App通过REST API与Arduino Yun合作。每按一次按钮,我就会发出HTTP请求,以便向前,向后,向左或向右移动车辆。 这是我的代码(尽管西班牙语,我认为这是可以理解的):
public class MainActivity extends Activity {
private Button boton1,
boton2,
boton3,
boton4;
private String valor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
configuracion();
}
public void configuracion(){
StrictMode.ThreadPolicy policy = new StrictMode.
ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
establecerBotones();
try{
definir("continua/0/0");
definir("direccion/0/0");
}
catch(Exception e){
Alerta();
}
}
public void establecerBotones(){
boton1= (Button)findViewById(R.id.boton1); //all buttons do something similar
boton1.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch(action){
case MotionEvent.ACTION_DOWN:
v.setPressed(true);
conectar("continua/1/0");
break;
case MotionEvent.ACTION_OUTSIDE:
case MotionEvent.ACTION_UP:
v.setPressed(false);
try {
conectar("continua/0/0");
} catch (Exception e) {
}
break;
}
return true;
}
});
boton2= (Button)findViewById(R.id.boton2);
boton2.setOnTouchListener(new OnTouchListener() {
});
boton3= (Button)findViewById(R.id.boton3);
boton3.setOnTouchListener(new OnTouchListener() {
});
boton4= (Button)findViewById(R.id.boton4);
boton4.setOnTouchListener(new OnTouchListener() {
});
}
private void conectar(final String selector) {
new Thread() {
@Override
public void run() {
try {
// code runs in a thread
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
definir (selector);
} catch (Exception e) {
System.out.println("holi");
}
}
});
} catch (final Exception ex) {
}
}
}.start();
}
public void definir(String selector) throws Exception{
valor = "http://192.168.240.1/arduino/" + selector;
URL url = new URL(valor);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
leer(in);
}
finally {
urlConnection.disconnect();
}
}
public void leer(InputStream in) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
if ((reader.readLine()) != "1") throw new IOException();
//Arduino is programmed to print "1" when connection succedes
}
public void Alerta(){
Context context = getApplicationContext();
CharSequence text = "Conexion erronea";
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, text, duration);
toast.show();
}
PD:我是编程的初学者,今年我开始纯粹学习java(和android)。我可能正在做一些"哑巴"我的代码上的错误。我将不胜感激任何帮助或建议。谢谢你的阅读。
答案 0 :(得分:0)
您在代码中遇到问题,如评论中所述。如果你在UI线程上做任何时间的事情,Android表现得很糟糕。您需要将外部连接移动到单独的线程上,并找到通过它进行通信的方法。作为一名新手程序员,你会发现这很难,但是有很多代码示例需要帮助。
但是这(以及您发布的代码)与您的真实问题无关。你有一个“开环”控制机制,你需要关闭循环。您需要一种方法让受控设备响应有关其是否已移动或正在移动的一些信息,并且您需要相应地修改控制策略。
或者,您可以向车辆发送更复杂的命令(例如“左3”或“直线前进”),并将回路监控保留给车辆的车载处理器。
这些都是常见的问题,你会发现很多一般的阅读材料很少搜索。如果您有非常具体的问题,Stack Overflow可能会提供更好的帮助。