シリアル ポートを周辺機器に接続するときに発生した NullPointerException を確認します。

古いプロジェクトのメンテナンスが 2021 年 7 月 30 日の直前に受け取られたことが記録されています。
これには周辺機器接続 (タブレットは Jiabo メーカーの計量機に接続されています) が含まれており、データはリアルタイムでタブレットに返される必要があります。ディスプレイ用。問題は、データが返されるのが速い場合と遅い場合があるため、1 つずつ確認するしかないことです。
AS を開き、タブレットを接続し、ログを確認します。この異常をブラッシングし終えることさえできません。

		...
java.lang.NullPointerException: Attempt to invoke virtual method 'int com.gprinter.io.PortManager.readData(byte[])' on a null object reference
        at com.hycashier.devicelibrary.helper.BluetoothHelper$4.run(BluetoothHelper.java:198)
java.lang.NullPointerException: Attempt to invoke virtual method 'int com.gprinter.io.PortManager.readData(byte[])' on a null object reference
        at com.hycashier.devicelibrary.helper.BluetoothHelper$4.run(BluetoothHelper.java:198)
java.lang.NullPointerException: Attempt to invoke virtual method 'int com.gprinter.io.PortManager.readData(byte[])' on a null object reference
        at com.hycashier.devicelibrary.helper.BluetoothHelper$4.run(BluetoothHelper.java:198)
        ...

このブロックのコードは次のようになります。

/**
     * 接收数据的方法
     */
    public void startReceiveData(){
    
    
        receiveFlag = true;
        /*创建子线程接收串口数据
         */
        receiveThread = new Thread(){
    
    
            @Override
            public void run() {
    
    
                while (receiveFlag){
    
    
                    try {
    
    
                        serialData = "0".getBytes();

                        byte[] readData = new byte[1024];
                        int size = portManager.readData(readData);
                        byte[] realReadData = new byte[size];
                        System.arraycopy(readData,0,realReadData,0,size);
                        if (size>0&&receiveFlag) {
    
    
                            serialData = realReadData;
                        }
                        getMainHandler().sendEmptyMessage(receiveFlagWhat);
                        Thread.sleep(intervalTime);
                    } catch (Exception e){
    
    
                        e.printStackTrace();
                    }
                }
            }
        };
        //启动接收线程
        receiveThread.start();
    }

デバッグを通じて、portManager が空であることがわかりました。新しいアクティビティを開き続けると、リアルタイム データを取得するために再びここにアクセスし、CPU が急上昇します...つまり、新しい子が作成されるたびに
ここに画像の説明を挿入します
ここに画像の説明を挿入します
、データを取得して (このタブレットのパフォーマンスは 5 ~ 6 年前の構成にすぎません)、空ではない判定を試すことしかできません。

/**
     * 接收数据的方法
     */
    public void startReceiveData(){
    
    
        receiveFlag = true;
        /*创建子线程接收串口数据
         */
        receiveThread = new Thread(){
    
    
            @Override
            public void run() {
    
    
                while (receiveFlag && portManager!=null){
    
    
                    try {
    
    
                        serialData = "0".getBytes();

                        byte[] readData = new byte[1024];
                        int size = portManager.readData(readData);
                        byte[] realReadData = new byte[size];
                        System.arraycopy(readData,0,realReadData,0,size);
                        if (size>0&&receiveFlag) {
    
    
                            serialData = realReadData;
                        }
                        getMainHandler().sendEmptyMessage(receiveFlagWhat);
                        Thread.sleep(intervalTime);
                    } catch (Exception e){
    
    
                        e.printStackTrace();
                    }
                }
            }
        };
        //启动接收线程
        receiveThread.start();
    }

個人テストは成功し、少なくとも CPU が削減されました。
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/liuzhuo13396/article/details/119249433