【问题标题】:Changing String from buffer to int将字符串从缓冲区更改为 int
【发布时间】:2021-12-01 15:50:10
【问题描述】:

所以另一个来自相同代码的另一个问题。
这是代码

package com.test.aplikasirevisi;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import android.app.Activity;
import android.app.ProgressDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

import static com.test.aplikasirevisi.Information.Highest;
import static com.test.aplikasirevisi.Information.Lowest;
import static com.test.aplikasirevisi.Information.mypreference;


public class MonitoringScreen extends Activity {
    private static final String TAG = "BlueTest5-MainActivity";
    private int mMaxChars = 50000;//Default
    private UUID mDeviceUUID;
    private BluetoothSocket mBTSocket;
    private ReadInput mReadThread = null;
    TextView highest;
    TextView lowest;
    private boolean mIsUserInitiatedDisconnect = false;

    private TextView mTxtReceive;
    private Button mBtnClearInput;
    private Button mBtnGetBPM;
    private ScrollView scrollView;
    private CheckBox chkScroll;
    private CheckBox chkReceiveText;


    private boolean mIsBluetoothConnected = false;

    private BluetoothDevice mDevice;

    private ProgressDialog progressDialog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_monitoring_screen);
        ActivityHelper.initialize(this);

        Intent intent = getIntent();
        Bundle b = intent.getExtras();
        mDevice = b.getParcelable(MainActivity.DEVICE_EXTRA);
        mDeviceUUID = UUID.fromString(b.getString(MainActivity.DEVICE_UUID));
        mMaxChars = b.getInt(MainActivity.BUFFER_SIZE);
        Log.d(TAG, "Ready");
        mTxtReceive = (TextView) findViewById(R.id.txtReceive);
        chkScroll = (CheckBox) findViewById(R.id.chkScroll);
        chkReceiveText = (CheckBox) findViewById(R.id.chkReceiveText);
        scrollView = (ScrollView) findViewById(R.id.viewScroll);
        mBtnClearInput = (Button) findViewById(R.id.btnClearInput);
        mBtnGetBPM = (Button) findViewById(R.id.mBtnGetBPM);
        mTxtReceive.setMovementMethod(new ScrollingMovementMethod());
        highest = (TextView) findViewById(R.id.etHighest);
        lowest = (TextView) findViewById(R.id.etLowest);
        SharedPreferences sharedpreferences = getSharedPreferences(mypreference,
                Context.MODE_PRIVATE);
        if (sharedpreferences.contains(Highest)) {
            highest.setText(sharedpreferences.getString(Highest, ""));
        }
        if (sharedpreferences.contains(Lowest)) {
            lowest.setText(sharedpreferences.getString(Lowest, ""));
        }
        mBtnClearInput.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                mTxtReceive.setText("");
            }
        });
        
    }
    private class ReadInput implements  Runnable{
        private boolean bStop = false;
        private Thread t;

        public ReadInput() {
            t = new Thread(this, "Input Thread");
            t.start();
        }

        public boolean isRunning() {
            return t.isAlive();
        }

        @Override
        public void run() {
            InputStream inputStream;

            try {
                inputStream = mBTSocket.getInputStream();
                while (!bStop) {
                    byte[] buffer = new byte[256];
                    if (inputStream.available() > 0) {
                        inputStream.read(buffer);
                        int i;
                        /*
                         * This is needed because new String(buffer) is taking the entire buffer i.e. 256 chars on Android 2.3.4 http://stackoverflow.com/a/8843462/1287554
                         */
                        for (i = 0; i < buffer.length && buffer[i] != 0; i++) {
                        }
                        final String strInput = new String(buffer, 0, i);
                        String getHi = null;


                        SharedPreferences sharedpreferences = getSharedPreferences(mypreference,
                                Context.MODE_PRIVATE);
                        if (sharedpreferences.contains(Highest)) {
                            highest.setText(sharedpreferences.getString(Highest, ""));
                            getHi=highest.getText().toString();
                        }
                        if (sharedpreferences.contains(Lowest)) {
                            lowest.setText(sharedpreferences.getString(Lowest, ""));
                        }
                        int hi = Integer.parseInt(getHi);

                        /*
                         * If checked then receive text, better design would probably be to stop thread if unchecked and free resources, but this is a quick fix
                         */

                        if (chkReceiveText.isChecked()) {
                            mTxtReceive.post(new Runnable() {
                                @Override
                                public void run() {
                                    mTxtReceive.append(strInput);
                                    System.out.println(strInput);
                                    if(data < hi){
                                        Log.d(TAG, "succes");
                                    }
                                    int txtLength = mTxtReceive.getEditableText().length();
                                    if(txtLength > mMaxChars){
                                        mTxtReceive.getEditableText().delete(0, txtLength - mMaxChars);
                                        Log.d(TAG, "text longer than allowed:" + mTxtReceive.getEditableText().delete(0, txtLength - mMaxChars));

                                    }

                                    if (chkScroll.isChecked()) { // Scroll only if this is checked
                                        scrollView.post(new Runnable() { // Snippet from http://stackoverflow.com/a/4612082/1287554
                                            @Override
                                            public void run() {
                                                scrollView.fullScroll(View.FOCUS_DOWN);
                                            }
                                        });
                                    }
                                }
                            });
                        }

                    }
                    Thread.sleep(500);
                }
            } catch (IOException e) {
// TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InterruptedException e) {
// TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

        public void stop() {
            bStop = true;
        }

    }
    private class DisConnectBT extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
        }

        @Override
        protected Void doInBackground(Void... params) {

            if (mReadThread != null) {
                mReadThread.stop();
                while (mReadThread.isRunning())
                    ; // Wait until it stops
                mReadThread = null;

            }

            try {
                mBTSocket.close();
            } catch (IOException e) {
// TODO Auto-generated catch block
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            mIsBluetoothConnected = false;
            if (mIsUserInitiatedDisconnect) {
                finish();
            }
        }

    }
    private void msg(String s) {
        Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onPause() {
        if (mBTSocket != null && mIsBluetoothConnected) {
            new DisConnectBT().execute();
        }
        Log.d(TAG, "Paused");
        super.onPause();
    }

    @Override
    protected void onResume() {
        if (mBTSocket == null || !mIsBluetoothConnected) {
            new ConnectBT().execute();
        }
        Log.d(TAG, "Resumed");
        super.onResume();
    }

    @Override
    protected void onStop() {
        Log.d(TAG, "Stopped");
        super.onStop();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
        super.onSaveInstanceState(outState);
    }

    private class ConnectBT extends AsyncTask<Void, Void, Void> {
        private boolean mConnectSuccessful = true;

        @Override
        protected void onPreExecute() {
            progressDialog = ProgressDialog.show(MonitoringScreen.this, "Hold on", "Connecting");// http://stackoverflow.com/a/11130220/1287554
        }

        @Override
        protected Void doInBackground(Void... devices) {

            try {
                if (mBTSocket == null || !mIsBluetoothConnected) {
                    mBTSocket = mDevice.createInsecureRfcommSocketToServiceRecord(mDeviceUUID);
                    BluetoothAdapter.getDefaultAdapter().cancelDiscovery();
                    mBTSocket.connect();
                }
            } catch (IOException e) {
// Unable to connect to device
                e.printStackTrace();
                mConnectSuccessful = false;
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            if (!mConnectSuccessful) {
                Toast.makeText(getApplicationContext(), "Could not connect to device. Is it a Serial device? Also check if the UUID is correct in the settings", Toast.LENGTH_LONG).show();
                finish();
            } else {
                msg("Connected to device");
                mIsBluetoothConnected = true;
                mReadThread = new ReadInput(); // Kick off input reader
            }

            progressDialog.dismiss();
        }

    }
}

我想把这部分的字符串改成int:

final String strInput = new String(buffer, 0, i);

所以我可以在这部分使用它:

 if(data < hi){
 Log.d(TAG, "succes");
 }

我试过了

int data = Integer.parseInt(strInput);

但它当然会跨越错误,因为它的字符串缓冲区并且只有第一个被更改
那么我该如何解决这个问题?如果有人可以提供帮助
我已经尝试过使用 arraylist 但仍然出错
这是错误代码:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.test.aplikasirevisi, PID: 21905
    java.lang.NumberFormatException: For input string: "40
    "
        at java.lang.Integer.parseInt(Integer.java:615)
        at java.lang.Integer.parseInt(Integer.java:650)
        at com.test.aplikasirevisi.MonitoringScreen$ReadInput$1.run(MonitoringScreen.java:152)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:201)
        at android.app.ActivityThread.main(ActivityThread.java:6810)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
I/Process: Sending signal. PID: 21905 SIG: 9

【问题讨论】:

    标签: java android android-studio


    【解决方案1】:

    错误消息告诉您出了什么问题。您的输入似乎是 "40 和 " 不是数字字符。您需要确保输入的字符串是数字,或者您需要在尝试将其转换为整数之前从字符串中提取数字分量。如果索引 0 处的字符始终是双引号字符,您可以尝试 new String(buffer, 1, i)。

    更新:

    根据您在此处发布的最后一条评论,您需要按如下方式初始化您的strInput(这是一个示例):

        byte[] bytes = new byte[5];
        bytes[0] = 49; // this is the ASCII value of the number "1"
        bytes[1] = '\u0000'; // These are null characters
        bytes[2] = '\u0000';
        bytes[3] = '\u0000';
        bytes[4] = '\u0000';
    
        String temp = new String(bytes); // convert the byte array to String
        String str = temp.substring(0, temp.indexOf('\u0000')); // parse the numeric contents
        System.out.println(str); // You should see "1" printed out
        int number = Integer.parseInt(str); // Because I parsed the numeric contents, it is safe to convert the String to a number.
    

    【讨论】:

    • 试过还是一样
    • @WhiliamsThunardy 在您尝试解析之前,buffer 的全部内容是什么?
    • 它来自传感器 arduino
    • @WhiliamsThunardy 我的意思是让您打印出来以控制台String getHi = null; 正上方的strInput,这样您就可以看到它的内容是什么。这应该是您自己调试的一部分。
    • 我不明白,但是在尝试了你建议的方法之后,它现在出现了 135 ������������������������������������������������������������������������������������������������������ 它应该只打印 135
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 2016-09-23
    • 1970-01-01
    相关资源
    最近更新 更多