Слушатель Android прерывает прослушиватель

Вопрос:

Я работаю над дистанционным управлением. Есть автомобиль, у него есть серво + эс, и они подключены к ардуину, который подключен к экрану wifi. С другой стороны у меня есть Android-планшет, который отправляет данные в arduino для управления автомобилем. Существует исходный код для приложения для Android:

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

}
}

В приложении есть два поисковых барабана и 1 кнопка. Seekbars контролирует управление и скорость. Кнопка управления прерывается. Когда у каждого из этих объектов есть свой собственный слушатель. И когда я касаюсь любого из этих объектов, вызывается слушатель, который отправляет два байта: первый байт обозначает nr команды, второй – значение. Проблема в том, что когда я постоянно касаюсь объектов, недавно вызываемый слушатель прерывается следующим вызываемым слушателем. Так что arduino получает случайные байты. У кого-нибудь есть идея, как это исправить? Как сделать слушателя полностью?

Ответ №1

Извините, что попросил вас сделать шаг назад. Вы можете действовать следующим образом.

Сначала убедитесь, что функция обратного вызова действительно прервана. Проверьте это, взяв данные, записанные в DOS. Вы можете сделать это, построив DOS с помощью FileOutputStream вместо socket.getOutputStream. Теперь все ваши записи DOS записывают данные в файл.

Запустите приложение – выполните некоторые быстрые действия пользовательского интерфейса – потяните файл – убедитесь, что записи действительно в случайном порядке. Чтобы упростить задачу проверки, напишите только фиксированные известные значения прогресса ползунка, а не фактические. Это сделает вашу жизнь легкой идентификацией команд и ценностей.

Пожалуйста, опубликуйте результат. Если проблема все еще сохраняется (она не должна :)), мы будем синхронизировать вызовы записи DOS.

Оцените статью
TechArks.Ru
Добавить комментарий