首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取NFC标签,直到将其分离,并在读取标签时更新UI

读取NFC标签,直到将其分离,并在读取标签时更新UI
EN

Stack Overflow用户
提问于 2019-05-26 04:02:37
回答 1查看 231关注 0票数 1

我想读取NFC标签,直到设备从NFC标签移开。然后我想做一些活动。我已经设法做到了这一点,使用while循环读取标记并捕获InterruptedException。我还希望在读取while循环中的标记时更新UI。当我在while循环中时,我找不到一种方法来更新UI。

用于更新UI的数据来自onLocationChanged-listener。

代码语言:javascript
复制
public void onLocationChanged(Location location) {
    if (location.hasSpeed()) {
        /*double speed=location.getSpeed() * 3.6;;
        while (1==1)
        {*/
        speed = location.getSpeed() * 3.6;
        String units="km/h";
        s= new SpannableString(String.format(Locale.ENGLISH, "%.0f %s", speed, units));
        s.setSpan(new RelativeSizeSpan(0.45f), s.length()-units.length()-1, s.length(), 0);
        updateUI();

    }
}

public void updateUI(){
    drivingMode=findViewById(R.id.txtDriving);
    currentSpeed = findViewById(R.id.valSpeed);
      if (currentSpeed!=null) {
        currentSpeed.setText(s);
        if (speed > 10) {
            drivingMode.setText(R.string.msg_driving);
            isDriving = true;
        } else {
            drivingMode.setText(R.string.msg_notDriving);
            isDriving=false;
        }
    }
}

private void readFromNFC( Ndef ndef)  {
            try
            {
                ndef.connect();
                NdefMessage ndefMessage = ndef.getNdefMessage();
                ndef.close();
                String message = new String(ndefMessage.getRecords()[0].getPayload());
                // Log.d(TAG, "readFromNFC Before Pass: " + message);
                //Toast.makeText(this, "Text" + message, Toast.LENGTH_LONG).show();
                if (message.equals("in")) {
                    Toast.makeText(this.getApplicationContext(), R.string.message_nfc_holder_detected, Toast.LENGTH_LONG).show();
                    if (isDialogshowing) {
                        dialog.dismiss();
                        isEmergency=false;
                    }
                    while (1 == 1) {
                        ndef.connect();
                        ndefMessage = ndef.getNdefMessage();
                        message = new String(ndefMessage.getRecords()[0].getPayload());
                        //Log.d(TAG, "readFromNFCPassed: " + message);
                        TimeUnit.SECONDS.sleep(1);
                        ndef.close();
                        updateUI();
                    }

                } else {
                    Toast.makeText(this.getApplicationContext(), R.string.message_nfc_holder_error, Toast.LENGTH_LONG).show();
                    ndef.close();
                }

            } catch (IOException | FormatException | InterruptedException e ) {
                e.printStackTrace();
                Toast.makeText(this.getApplicationContext(), R.string.message_nfc_holder_detached, Toast.LENGTH_LONG).show();
                if(isDriving) {
                    activateEmergency();
                }
                else
                {
                    if (isDialogshowing) {
                        dialog.dismiss();
                        dialog.dismiss();
                        isDialogshowing = false;
                    }

                }
            }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-29 02:52:56

为了连续读取UI线程而不阻塞主UI线程,您可以使用AsyncTask。这还允许您使用onProgressUpdate()回调将状态更新发布到UI (线程)。

你的AsyncTask可能看起来像这样:

代码语言:javascript
复制
private class ProcessNFCTask extends AsyncTask<Ndef, NdefMessage, Void> {
    protected Void doInBackground(Ndef... tag) {
        // This happens on the worker thread!

        // TODO: content of readFromNFC(Ndef ndef);
        // Instead of calling updateUI(), you would call publishProgress(message).
        // You can use whatever represents your progress instead of "message".
        // Instead of doing your finalization stuff (what you currently have
        // in the catch clause) here, you would want to do that in
        // onPostExecute() instead.
    }

    protected void onProgressUpdate(NdefMessage... progress) {
        // This happens on the UI thread!

        // You may also use the progress status information provided in
        // "progress" here. This is what you pass to publishProgress(...).
        updateUI();
    }

    protected void onPostExecute(Void result) {
        // This happens on the UI thread!

        // TODO: Whatever you want to do when you are finished reading, e.g.:
        if (isDriving) {
            activateEmergency();
        } else {
            if (isDialogshowing) {
                dialog.dismiss();
                dialog.dismiss();
                isDialogshowing = false;
            }
        }
    }

}

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

https://stackoverflow.com/questions/56308290

复制
相关文章

相似问题

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