Сокет Bluetooth становится нулевым при попытке закрыть его (Ошибка: ссылка на нулевой объект) - PullRequest
0 голосов
/ 06 февраля 2019

В моем приложении есть MainActivity.java, который инициализирует 2 кнопки (btnBTConnect и btnBTStop) и вызывает для них методы setOnClickListener.

В BluetoothActivity.java у меня есть методы onClick, которые вызывают методы.Для btnBTConnect он вызывает мои методы, чтобы найти устройство Bluetooth (findBT), подключиться к нему и получить inputStream (openBT).Для btnBTStop он вызывает мой метод для закрытия соединения (closeBT).

Когда я нажимаю кнопку запуска Bluetooth, у меня нет проблем.Соединение установлено, и данные получены, как и ожидалось (BluetoothSocket и InputStream НЕ являются нулевыми).

Однако, когда я нажимаю кнопку «Стоп», чтобы остановить данные и закрыть InputStream и Socket, я получаю нулевое значениеошибка ссылки на объект.

Может кто-нибудь помочь?Это из-за того, что у меня есть настройка onClick?С помощью switch и case все мои переменные из методов findBT и openBT удаляются, когда он переключается на остановочный случай bluetooth?Вот почему мои Bluetooth Socket и InputStream имеют нулевое значение, когда я пытаюсь их закрыть?

Как я могу это исправить?

Спасибо

MainAcitivity

public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";

public Button btnBTConnect;
public Button btnBTStop;
BluetoothAdapter mBTAdap;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mBTAdap = BluetoothAdapter.getDefaultAdapter();

    btnBTConnect = findViewById(R.id.btnBTConnect);
    btnBTStop = findViewById(R.id.btnBTStop);
    btnBTConnect.setOnClickListener(new BluetoothActivity(getApplicationContext()));
    btnBTStop.setOnClickListener(new BluetoothActivity(getApplicationContext()));
}

BluetoothActivity

public class BluetoothActivity implements View.OnClickListener{

private static final String TAG = "BluetoothActivity";
Context mContext;
public BluetoothAdapter mBTAdap;
public BluetoothSocket mBTSock;
public BluetoothDevice mBTDev;
public InputStream mBTIP;
public Thread mBTThread;
byte[] mBuffer;
volatile boolean mStopThread;

public BluetoothActivity(Context myContext) {
    this.mBTAdap = BluetoothAdapter.getDefaultAdapter();
    this.mContext = myContext;
}

@Override
public void onClick(View mView) {
    switch (mView.getId()){
        case R.id.btnBTConnect:
            try {
                findBT();
                openBT();
            } catch (IOException e) {Log.e(TAG, "onClick: " + e.getMessage(), e);}
            break;
        case R.id.btnBTStop:
            try {
                closeBT();
            } catch (IOException e) {Log.e(TAG, "onClick: " + e.getMessage(), e);}
            break;
        default:
            break;
    }
}

public void findBT() {
    Set<BluetoothDevice> mBTPairedDevices = mBTAdap.getBondedDevices();
    if (mBTPairedDevices.size() > 0) {
        for (BluetoothDevice device : mBTPairedDevices) {
            if (device.getName().equals("myDevice")) {
                mBTDev = device;
                toastMessage(mBTDev.getName() + " device found");
                break;
            } else {toastMessage("No device found");}
        }
    } else {toastMessage("No Devices paired");}

}

public void openBT() throws IOException
{
    UUID mUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
    try {
        mBTSock = mBTDev.createRfcommSocketToServiceRecord(mUUID);
    } catch (IOException e) {
        Log.e(TAG, "openBT: " + e.getMessage(), e); toastMessage("Couldn't create RFComm socket");}
    mBTSock.connect();
    mBTIP = mBTSock.getInputStream();
    listenBT();
}

public void listenBT(){
    mStopThread = false;
    mBuffer = new byte[6];

    mBTThread = new Thread(new Runnable() {
        @Override
        public void run() {
            while (!Thread.currentThread().isInterrupted() && !mStopThread) {
                try {
                    bytes = mBTIP.read(mBuffer);
                } catch (IOException e) {
                    mStopThread = true;
                    Log.e(TAG, "run: " + e.getMessage(), e);
                }
            }
        }
    }); mBTThread.start();
}

public void closeBT() throws IOException {
    mStopThread = true;
    mBTIP.close();
    mBTSock.close();

    toastMessage("BT Closed");
    Log.d(TAG, "closeBT: BT Closed");
}

private void toastMessage(String message){
    Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();
}

}

Logcat

02-06 19:54:41.256 3915-3915/com.example.mark.btconnflow E/AndroidRuntime: FATAL EXCEPTION: main
                                                                       Process: com.example.mark.btconnflow, PID: 3915
                                                                       java.lang.NullPointerException: Attempt to invoke virtual method 'void android.bluetooth.BluetoothSocket.close()' on a null object reference
                                                                           at com.example.mark.btconnflow.BluetoothActivity.closeBT(BluetoothActivity.java:202)
                                                                           at com.example.mark.btconnflow.BluetoothActivity.onClick(BluetoothActivity.java:79)
                                                                           at android.view.View.performClick(View.java:6261)
                                                                           at android.widget.TextView.performClick(TextView.java:11159)
                                                                           at android.view.View$PerformClick.run(View.java:23751)
                                                                           at android.os.Handler.handleCallback(Handler.java:751)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                           at android.os.Looper.loop(Looper.java:154)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:6776)
                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)

1 Ответ

0 голосов
/ 06 февраля 2019

Вы делаете два разных объекта и помещаете их в слушателей.Попробуйте с:

    BluetoothActivity listener = new BluetoothActivity(getApplicationContext());
    btnBTConnect.setOnClickListener(listener);
    btnBTStop.setOnClickListener(listener);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...