Я хочу писать разные сообщения NDEF внутри цикла while().
ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ: похоже, что микроконтроллер не может так быстро обрабатывать данные, поэтому мою проблему нельзя решить.
//ndef.connect();
ndef.writeNdefMessage(message);
//ndef.close();
Мой метод write(), упрощенный, без всех попыток/поймать
Итак, первый цикл работает правильно, а следующие нет. Но после нескольких циклов он снова работает еще раз. Это повторяется.
stop = 0;
while(stop < 1000)
{
write();
stop++
}
write() работает правильно для одного цикла.
РЕДАКТИРОВАТЬ: я заменил while() на таймер:
new Timer().schedule(new TimerTask() {
@Override
public void run() {
write();
}
}, 2000);
Но это слишком медленно... Мне нужно писать не менее 5 раз в секунду. Если я устанавливаю период таймера меньше 2000, он не работает, работает так же, как и while()
EDIT2: я измерил скорость передачи и получения сообщения. Кажется, для отправки сообщения требуется около 55 мс, а для получения - около 7 мс. Это то, что я хочу, но если я установлю таймер на повторение, например, через 100 мс, у меня будет эта ошибка от writeNDEFmessage()
: java.io.IOException: Tag is not ndef
. Итак, если я зацикливаюсь 10 раз writeNDEFmessage()
, он отлично работает в первом цикле, но я получаю исключение в следующих 9.
РЕДАКТИРОВАТЬ3:
onNewIntent()
:
@Override
protected void onNewIntent(Intent intent)
{
try {
if(intent.getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED) ||
intent.getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED)||
intent.getAction().equals(NfcAdapter.ACTION_TECH_DISCOVERED))
{
detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
if(detectedTag != lastDetectedTag)
{
lastDetectedTag = detectedTag;
setIntent(intent);
}
}
} catch (Exception e)
{
Log.e("", "onIntent >>> "+e.getMessage());
}
}
Это назначено на кнопку:
public void testWrite()
{
final Timer timer = new Timer();
try {
ndef = Ndef.get(detectedTag);
ndef.connect();
} catch (IOException e) {
Log.e("", "Cannot connect");
e.printStackTrace();
}
timer.schedule(new TimerTask() {
@Override
public void run() {
transmit.writeTag(message), ndef)
}, 0, 200);
}
и writeTag()
:
public boolean writeTag(String str, Ndef ndef) {
try {
message = getNdefMessage(str);
}
catch (Exception e)
{
toast("Message error");
}
int size = message.toByteArray().length;
try {
if (ndef != null) {
if(!ndef.isConnected())
{
ndef.connect();
Log.e("", ""+ndef.toString());
}
if (!ndef.isWritable()) {
return false;
}
if (ndef.getMaxSize() < size) {
toast("Tag capacity is " + ndef.getMaxSize() + " bytes, message is " + size + " bytes.");
return false;
}
try{
ndef.writeNdefMessage(message);
}
catch(IOException e){
toast("error send");
Log.e("IOException", e + "-+-");
return false;
}
return true;
}
}
catch (Exception e) {
toast("Failed to write tag");
}
return false;
}
transmit
— это объект класса Transmit
, в котором определен writeTag()
onCreate()
:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView);
transmit = new Transmit(this);
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
textView.setText("");
detectedTag = getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG);
lastDetectedTag = detectedTag;
pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0,
new Intent(this, getClass()).
addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
IntentFilter filter2 = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
readTagFilters = new IntentFilter[]{tagDetected,filter2};
techListsArray = new String[][] { new String[] { NfcF.class.getName() } };
if (mNfcAdapter == null) {
// Stop here, we definitely need NFC
finish();
return;
}
if (!mNfcAdapter.isEnabled()) {
}
buttonListener(testButton);
}
ndef.connect{}
иndef.close()
? Это может быть сделано вне цикла. Интересно, зачем вы проводите такие стресс-тесты? Возможно, есть другой способ достичь цели. - person vlp   schedule 13.08.2015ndef.connect()
иndef.close()
из цикла. Такой же... - person user3623498   schedule 13.08.2015runOnUiThread()
. В отладчике я добавил точку останова вonNewIntent
, и она достигает ее каждые 4-5 циклов, такжеisConnected()
возвращает false для 4-5 циклов - person user3623498   schedule 17.08.2015detectedtag.toString()
возвращаетTAG: Tech [android.nfc.tech.IsoDep, android.nfc.tech.NfcA, android.nfc.tech.Ndef]
- person user3623498   schedule 17.08.2015NfcAdapter.enableForegroundDispatch()/disableForegroundDispatch()
я получаюonNewIntent
после каждого цикла... - person user3623498   schedule 17.08.2015