1

Error I'm getting null point exception in Bluetooth when I'm starting a service.

LiveFragment.class

public class LiveFragment extends Fragment {


    // Intent request codes
    private static final int REQUEST_CONNECT_DEVICE_SECURE = 1;
    private static final int REQUEST_CONNECT_DEVICE_INSECURE = 2;
    private static final int REQUEST_ENABLE_BT = 3;
    private BluetoothAdapter mBluetoothAdapter =null;
    public BluetoothChatService mChatService = null;
    private PowerManager.WakeLock wakeLock = null;
    private PowerManager powerManager = null;
    private String mConnectedDeviceName = null;
    private boolean isServiceBound;
    private boolean preRequisites = true;
    private SharedPreferences prefs;
    private BroadcastReceiver broadcastReceiver;
    private Context c;
    private AbstractGatewayService ab;

    protected ImageView blue_onoffBut, gps_Button, obd_inidca, ss_button, bluetooth_indicator, gps_indicator,obd_connectButt;
    protected TextView ss_Status,btStatusTextView,obdStatusTextView,gpsStatusTextView;
    private LinearLayout vv;
    protected BluetoothSocket sock = null;

    public LiveFragment() {
        // Required empty public constructor
    }

    private final Runnable mQueueCommands = new Runnable() {
        public void run() {
            Log.d(TAG, "Runnable mQueueCommands ()");
            if (ab != null && ab.isRunning() && ab.queueEmpty()) {
                queueCommands();
            }
            // run again in period defined in preferences
            new Handler().postDelayed(mQueueCommands, 4000);
        }
    };

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        final View view = inflater.inflate(R.layout.fragment_live, container, false);

        blue_onoffBut = (ImageView) view.findViewById(R.id.blutooth_butoon);
        gps_Button = (ImageView) view.findViewById(R.id.gps_button);
        obd_inidca = (ImageView) view.findViewById(R.id.obd_Indicator);
        ss_button = (ImageView) view.findViewById(ssButton);
        gps_indicator = (ImageView) view.findViewById(R.id.gps_indicator);
        bluetooth_indicator = (ImageView) view.findViewById(R.id.bluetooth_indicator);
        obd_connectButt = (ImageView) view.findViewById(R.id.Obd_Connect_Button);

        ss_Status = (TextView) view.findViewById(R.id.statusTx);
        btStatusTextView = (TextView) view.findViewById(R.id.blue);
        obdStatusTextView = (TextView) view.findViewById(R.id.obd);
        gpsStatusTextView = (TextView) view.findViewById(R.id.gps);
        vv = (LinearLayout) view.findViewById(R.id.fragment_live_layout);

        ss_Status.setTextColor(getResources().getColor(R.color.colorGreen));

        if (mBluetoothAdapter.isEnabled()) {
            bluetooth_indicator.setImageResource(R.drawable.green_circle);
        } else {
            bluetooth_indicator.setImageResource(R.drawable.red_circle);
        }

        gps_Button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final LocationManager manager = (LocationManager) getActivity().getSystemService( Context.LOCATION_SERVICE );
                if ( !manager.isProviderEnabled( LocationManager.GPS_PROVIDER ) ) {
                    buildAlertMessageNoGps();
                }
                else {
                    showToast("Already GPS is ON");
                }
            }
        });

        blue_onoffBut.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!mBluetoothAdapter.isEnabled()) {
                    mBluetoothAdapter.enable();
                    showToast("Bluetooth Turned ON"+"\n"+"Connect Your OBD now");
                    bluetooth_indicator.setImageResource(R.drawable.green_circle);
                    mChatService = new BluetoothChatService(getActivity(), mHandler);

                    if (mChatService != null) {
                        // Only if the state is STATE_NONE, do we know that we haven't started already
                        if (mChatService.getState() == BluetoothChatService.STATE_NONE) {
                            // Start the Bluetooth chat services
                            mChatService.start();
                        }
                    }
                } else if (mBluetoothAdapter.isEnabled()) {
                    mBluetoothAdapter.disable();
                    mBluetoothAdapter.cancelDiscovery();
                    obd_inidca.setImageResource(R.drawable.red_circle);
                    showToast("Bluetooth Turned OFF");
                    bluetooth_indicator.setImageResource(R.drawable.red_circle);
                }
            }
        });

        ss_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (mBluetoothAdapter.isEnabled() && mChatService.getState() == BluetoothChatService.STATE_CONNECTED) {
                    startLiveData();
                } else if (!mBluetoothAdapter.isEnabled()) {
                    showToast("Turn ON Bluetooth to Continue");
                }
                else if (!(mChatService.getState() == BluetoothChatService.STATE_CONNECTED)){
                    showToast("Select your OBD to Start ");
                }
            }
        });

        obd_connectButt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mBluetoothAdapter.isEnabled()) {
                    Intent serverIntent = new Intent(getActivity(), DeviceListActivity.class);
                    startActivityForResult(serverIntent, REQUEST_CONNECT_DEVICE_SECURE);
                }
                else if (!mBluetoothAdapter.isEnabled()){
                    showToast("Turn ON Bluetooth to Connect OBD");
                }
            }
        });

        return view;
    }

    private ServiceConnection serviceConn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName className, IBinder binder) {
            Log.d(TAG, className.toString() + " service is bound");
            isServiceBound = true;
            ab = ((AbstractGatewayService.AbstractGatewayServiceBinder) binder).getService();
            ab.setContext(getActivity());
            Log.d(TAG, "Starting live data");
            try {
                ab.startService();
                if (preRequisites)
                    btStatusTextView.setText("Connected");
            } catch (IOException ioe) {
                Log.e(TAG, "Failure Starting live data");
                btStatusTextView.setText("Connection failed");
                doUnbindService();
            }
        }

        @Override
        protected Object clone() throws CloneNotSupportedException {
            Log.d(TAG, "CloneNotSupportedException ");
            return super.clone();
        }

        @Override
        public void onServiceDisconnected(ComponentName className) {
            Log.d(TAG, className.toString() + " service is unbound");
            isServiceBound = false;
        }
    };

    public static String LookUpCommand(String txt) {
        Log.d(TAG, "LookUpCommand() ");
        for (AvailableCommandNames item : AvailableCommandNames.values()) {
            if (item.getValue().equals(txt)) return item.name();
        }
        return txt;
    }

    public void updateTextView(final TextView view, final String txt) {
        Log.d(TAG, "updateTextView() ");
        new Handler().post(new Runnable() {
            public void run() {
                view.setText(txt);
            }
        });
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void stateUpdate(ObdCommandJob job) {
        final String cmdName = job.getCommand().getName();
        String cmdResult = "";
        final String cmdID = LookUpCommand(cmdName);
        Log.d(TAG, "stateUpdate() ");
        if (job.getState().equals(ObdCommandJob.ObdCommandJobState.EXECUTION_ERROR)) {
            cmdResult = job.getCommand().getResult();
            if (cmdResult != null && isServiceBound) {
                obdStatusTextView.setText(cmdResult.toLowerCase());
            }
        } else if (job.getState().equals(ObdCommandJob.ObdCommandJobState.BROKEN_PIPE)) {
            if (isServiceBound)
                stopLiveData();
        } else if (job.getState().equals(ObdCommandJob.ObdCommandJobState.NOT_SUPPORTED)) {
            cmdResult = "NA";
        } else {
            cmdResult = job.getCommand().getFormattedResult();
            if (isServiceBound)
                obdStatusTextView.setText("Receiving data...");
        }
        cmdResult.replace("NODATA", "0");
        if (vv.findViewWithTag(cmdID) != null) {
            TextView existingTV = (TextView) vv.findViewWithTag(cmdID);
            existingTV.setText(cmdResult);
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
        // Get local Bluetooth adapter
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        // If the adapter is null, then Bluetooth is not supported
        if (mBluetoothAdapter == null) {
            FragmentActivity activity = getActivity();
            Toast.makeText(activity, "No Bluetooth Feature in Device", Toast.LENGTH_LONG).show();
            activity.finish();
        }
    }

    @Override
    public void onStart() {
        super.onStart();

        final LocationManager manager = (LocationManager) getActivity().getSystemService( Context.LOCATION_SERVICE );

        if ( !manager.isProviderEnabled( LocationManager.GPS_PROVIDER ) ) {
            gps_indicator.setImageResource(R.drawable.red_circle);
        }
        if(mBluetoothAdapter.isEnabled()){
            mBluetoothAdapter.disable();
            bluetooth_indicator.setImageResource(R.drawable.red_circle);
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        powerManager = (PowerManager) getActivity().getSystemService(Context.POWER_SERVICE);
        wakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "ObdReader");

        final LocationManager manager = (LocationManager) getActivity().getSystemService( Context.LOCATION_SERVICE );
        if ( manager.isProviderEnabled( LocationManager.GPS_PROVIDER ) ) {
            gps_indicator.setImageResource(R.drawable.green_circle);
        } else {
            gps_indicator.setImageResource(R.drawable.red_circle);
        }
        EventBus.getDefault().register(this);
        if(mBluetoothAdapter.isEnabled()) {
            if (mChatService != null) {
                // Only if the state is STATE_NONE, do we know that we haven't started already
                if (mChatService.getState() == BluetoothChatService.STATE_NONE) {
                    // Start the Bluetooth chat services
                    mChatService.start();
                }
            }
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        Log.d(TAG, "Pausing..");
        releaseWakeLockIfHeld();
        EventBus.getDefault().unregister(this);
    }

    private void showToast(String message) {
        final Toast toast = Toast.makeText(getContext(), message, Toast.LENGTH_SHORT);
        toast.show();

        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                toast.cancel();
            }
        }, 500);
    }
    @Override
    public void onDestroy() {
       /* unregisterReceiver(mReceiver);*/
        super.onDestroy();
        releaseWakeLockIfHeld();
        if (mChatService != null) {
            mChatService.stop();
        }
        if (isServiceBound) {
            doUnbindService();
        }
        if (mBluetoothAdapter.isEnabled()) {
            mBluetoothAdapter.disable();
        }
        showToast("Take Care!");
    }

    private void startLiveData() {
        if (mChatService.getState() == BluetoothChatService.STATE_CONNECTED) {
            Log.d(TAG, "Starting live data..");
            ss_Status.setText("Stop");
            ss_Status.setTextColor(getResources().getColor(R.color.colorRed));
            wakeLock.acquire();

            ss_button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    ss_Status.setText("Go Live");
                    ss_Status.setTextColor(getResources().getColor(R.color.colorGreen));
                    stopLiveData();
                }
            });

            doBindService();

            LocalBroadcastManager.getInstance(getActivity()).registerReceiver((broadcastReceiver), new IntentFilter(OBD_GATEWAY_SERVICE));

            new Handler().post(mQueueCommands);
        }
    }

    private void stopLiveData() {
        Log.d(TAG, "Stopping live data..");
        releaseWakeLockIfHeld();
        new Handler().removeCallbacks(mQueueCommands);

        ss_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ss_Status.setText("Go Live");
                ss_Status.setTextColor(getResources().getColor(R.color.colorGreen));
                startLiveData();
            }
        });

        doUnbindService();
        LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(broadcastReceiver);
    }

    private void queueCommands() {
        Log.d(TAG, "LiveFragment queueCommands() ");
        if (isServiceBound) {
            for (ObdCommand Command : ObdConfig.getCommands()) {
                if (prefs.getBoolean(Command.getName(), true))
                    ab.queueJob(new ObdCommandJob(Command));
            }
        }
    }

    private void doBindService() {
        if (!isServiceBound) {
            Log.d(TAG, "Binding OBD service..");
            if (preRequisites) {
                btStatusTextView.setText("Connecting.....");
                Intent serviceIntent = new Intent(getActivity(),ObdGatewayService.class);
                getActivity().bindService(serviceIntent, serviceConn, Context.BIND_AUTO_CREATE);
            }
        }
    }

    private void doUnbindService() {
        if (isServiceBound) {
            if (ab.isRunning()) {
                ab.stopService();
                if (preRequisites)
                    btStatusTextView.setText("Ready...");
            }
            Log.d(TAG, "Unbinding OBD service..");
            getActivity().unbindService(serviceConn);
            isServiceBound = false;
            obdStatusTextView.setText("Disconnected");
        }
    }

    private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            FragmentActivity activity = getActivity();
            switch (msg.what) {
                case Constants.MESSAGE_STATE_CHANGE:
                    switch (msg.arg1) {
                        case BluetoothChatService.STATE_CONNECTED:
                            obd_inidca.setImageResource(R.drawable.green_circle);
                            break;
                        case BluetoothChatService.STATE_CONNECTING:
                obd_inidca.setImageResource(R.drawable.orange_circle);
                            break;
                        case BluetoothChatService.STATE_LISTEN:
                        case BluetoothChatService.STATE_NONE:
                    obd_inidca.setImageResource(R.drawable.red_circle);
                            break;
                    }
                    break;

                case Constants.MESSAGE_DEVICE_NAME:
                    // save the connected device's name
                    mConnectedDeviceName = msg.getData().getString(Constants.DEVICE_NAME);
                    if (null != activity) {
                        Toast.makeText(activity, "Connected to "
                                + mConnectedDeviceName, Toast.LENGTH_SHORT).show();
                        obd_inidca.setImageResource(R.drawable.green_circle);
                    }
                    break;
                case Constants.MESSAGE_TOAST:
                    if (null != activity) {
                        Toast.makeText(activity, msg.getData().getString(Constants.TOAST),
                                Toast.LENGTH_SHORT).show();
                    }
                    break;
            }
        }
    };

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case REQUEST_CONNECT_DEVICE_SECURE:
                // When DeviceListActivity returns with a device to connect
                if (resultCode == Activity.RESULT_OK) {
                    try {
                        connectDevice(data, true);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
        }
    }

    private void connectDevice(Intent data, boolean secure) throws IOException {
        // Get the device MAC address
        String address = data.getExtras()
                .getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS);
        // Get the BluetoothDevice object
        BluetoothDevice dev = mBluetoothAdapter.getRemoteDevice(address);
        // Attempt to connect to the device
        mChatService.connect(dev, secure);
    }.    

This is ObdGateway service class:

public class ObdGatewayService extends AbstractGatewayService {

    private static final String TAG = ObdGatewayService.class.getName();

    @Inject
    SharedPreferences prefs;

    private BluetoothDevice dev = null;
    private BluetoothSocket sock = null;
    private BluetoothChatService mChatservice = null;
    private BluetoothAdapter bluetoothAdapter =null;


    public final static String JOB_NAME_STAMP = "Name";
    public final static String JOB_STATE_STAMP = "State";
    public final static String JOB_RESULT_STAMP = "Result";
    public final static String JOB_FORMATED_RESULT_STAMP = "Formated REsult";
    public final static String OBD_GATEWAY_SERVICE = "com.samplersoft.saz.Obd.ObdGatewayService";

    public void startService() throws IOException {
        Log.d(TAG, "Starting service..");

        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        // get the remote Bluetooth device
        if(mChatservice.getState() != BluetoothChatService.STATE_CONNECTED){
            Toast.makeText(ctx, "No Bluetooth device selected", Toast.LENGTH_LONG).show();

            // log error
            Log.e(TAG, "No Bluetooth device has been selected.");

            stopService();
            throw new IOException();
        }
        else
        {
            Log.d(TAG, "Stopping Bluetooth discovery.");
            bluetoothAdapter.cancelDiscovery();

            try {
                startObdConnection();
            } catch (Exception e) {
                Log.e(
                        TAG,
                        "There was an error while establishing connection. -> "
                                + e.getMessage()
                );

                // in case of failure, stop this service.
                stopService();
                throw new IOException();
            }
        }
    }

    private void startObdConnection() throws IOException {
        Log.d(TAG, "Starting OBD connection..");
        isRunning = true;

            if(mChatservice.getState() == BluetoothChatService.STATE_CONNECTED){
                // Let's configure the connection.
                Log.d(TAG, "Queueing jobs for connection configuration..");
                queueJob(new ObdCommandJob(new ObdResetCommand()));
                try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); }

                queueJob(new ObdCommandJob(new EchoOffCommand()));
                queueJob(new ObdCommandJob(new EchoOffCommand()));
                queueJob(new ObdCommandJob(new LineFeedOffCommand()));
                queueJob(new ObdCommandJob(new TimeoutCommand(62)));

                // Get protocol from preferences
                queueJob(new ObdCommandJob(new SelectProtocolCommand(ObdProtocols.valueOf("AUTO"))));

                // Job for returning dummy data
                queueJob(new ObdCommandJob(new AmbientAirTemperatureCommand()));

                queueCounter = 0L;
                Log.d(TAG, "Initialization jobs queued.");

            }
            else {
                stopService();
                throw new IOException();
            }

        }

    @Override
    public void queueJob(ObdCommandJob job) {
        // This is a good place to enforce the imperial units option
        //job.getCommand().useImperialUnits(prefs.getBoolean(ConfigActivity.IMPERIAL_UNITS_KEY, false));

        // Now we can pass it along
        super.queueJob(job);
    }
    protected void executeQueue() throws InterruptedException {
        Log.d(TAG, "Executing queue..");
        while (!Thread.currentThread().isInterrupted()) {
            ObdCommandJob job = null;
            try {
                job = jobsQueue.take();

                // log job
                Log.d(TAG, "Taking job[" + job.getId() + "] from queue..");

                if (job.getState().equals(ObdCommandJob.ObdCommandJobState.NEW)) {
                    Log.d(TAG, "Job state is NEW. Run it..");
                    job.setState(ObdCommandJob.ObdCommandJobState.RUNNING);
                    if (sock.isConnected()) {
                        job.getCommand().run(sock.getInputStream(), sock.getOutputStream());
                    } else {
                        job.setState(ObdCommandJob.ObdCommandJobState.EXECUTION_ERROR);
                        Log.e(TAG, "Can't run command on a closed socket.");
                    }
                } else
                    // log not new job
                    Log.e(TAG,
                            "Job state was not new, so it shouldn't be in queue. BUG ALERT!");
            } catch (InterruptedException i) {
                Thread.currentThread().interrupt();
            } catch (UnsupportedCommandException u) {
                if (job != null) {
                    job.setState(ObdCommandJob.ObdCommandJobState.NOT_SUPPORTED);
                }
                Log.d(TAG, "Command not supported. -> " + u.getMessage());
            } catch (IOException io) {
                if (job != null) {
                    if(io.getMessage().contains("Broken pipe"))
                        job.setState(ObdCommandJob.ObdCommandJobState.BROKEN_PIPE);
                    else
                        job.setState(ObdCommandJob.ObdCommandJobState.EXECUTION_ERROR);
                }
                Log.e(TAG, "IO error. -> " + io.getMessage());
            } catch (Exception e) {
                if (job != null) {
                    job.setState(ObdCommandJob.ObdCommandJobState.EXECUTION_ERROR);
                }
                Log.e(TAG, "Failed to run command. -> " + e.getMessage());
            }

            ObdCommandJob job2 = job;
            if(job2 !=null)
                EventBus.getDefault().post(job2);
        }
    }
    public void stopService() {
        Log.d(TAG, "Stopping service..");

        jobsQueue.clear();
        isRunning = false;

        if (sock != null)
            // close socket
            try {
                sock.close();
            } catch (IOException e) {
                Log.e(TAG, e.getMessage());
            }
        // kill service
        stopSelf();
    }
    public boolean isRunning() {
        return isRunning;
    }
}.   

This is Abstract Class where service method gets called from from Livefragment Class from serivceConnection().

public abstract class AbstractGatewayService extends RoboService {

    private static final String TAG = AbstractGatewayService.class.getName();
    private final IBinder binder = new AbstractGatewayServiceBinder();
    protected Context ctx;
    protected boolean isRunning = false;
    protected Long queueCounter = 0L;
    protected BlockingQueue<ObdCommandJob> jobsQueue = new LinkedBlockingQueue<>();
    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                executeQueue();
            } catch (InterruptedException e) {
                t.interrupt();
            }
        }
    });

    protected LocalBroadcastManager broadcastManager;

    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "Creating service..");
       final BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        t.start();
        Log.d(TAG, "Service created.");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "Destroying service...");
        t.interrupt();
        broadcastManager = LocalBroadcastManager.getInstance(this);
        Log.d(TAG, "Service destroyed.");
    }

    public boolean isRunning() {
        return isRunning;
    }

    public boolean queueEmpty() {
        return jobsQueue.isEmpty();
    }

    public void queueJob(ObdCommandJob job) {
        queueCounter++;
        Log.d(TAG, "Adding job[" + queueCounter + "] to queue..");

        job.setId(queueCounter);
        try {
            jobsQueue.put(job);
            Log.d(TAG, "Job queued successfully.");
        } catch (InterruptedException e) {
            job.setState(ObdCommandJob.ObdCommandJobState.QUEUE_ERROR);
            Log.e(TAG, "Failed to queue job.");
        }
    }

    public void setContext(Context c) {
        ctx = c;
    }

    abstract protected void executeQueue() throws InterruptedException;

    abstract public void startService() throws IOException;

    abstract public void stopService();

    public class AbstractGatewayServiceBinder extends Binder {
        public AbstractGatewayService getService() {
            return AbstractGatewayService.this;
        }
    }
}.  
Vadim Kotov
  • 8,084
  • 8
  • 48
  • 62
Avinash S
  • 21
  • 5

1 Answers1

0

You are getting the exception because in class ObdGatewayService your class member mChatservice is not the same as mChatservice in class LiveFragment They are just different member variables

mChatservice gets assigned like this in your Fragment

mChatService = new BluetoothChatService(getActivity(), mHandler);

You need to pass this reference to ObdGatewayService 's startService() like this where ever you are instantiating/invoking it:-

ObdGatewayService ogs;
....
ogs.startservice(mChatservice); // This is fragment's member reference

And in ObdGatewayService you have to assign it accordingly:-

public void startService(BluetoothChatService _mChatservice) throws IOException {
        Log.d(TAG, "Starting service..");
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        mChatservice = _mChatservice  //Assignment YOU ARE MISSING THIS
        .......
        .......
}
Zakir
  • 2,222
  • 21
  • 31
  • But the start service is method is getting called by using the reference of abstract class which I have mentioned in the question?? Do you want me to directly call ogs.startSerivce() ? – Avinash S Jun 21 '17 at 18:57
  • I see , then pass the reference here `ab.startService(mChatservice)` And add the member in abstarct class – Zakir Jun 21 '17 at 19:01
  • yeah Thank you so much! it's working – Avinash S Jun 21 '17 at 19:09
  • Glad it worked for you! Can you pls accept- Upvote the ans – Zakir Jun 21 '17 at 19:11
  • done! @Zakir but I'm getting new Null pointer exception again in Live Fragment at java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.replace(java.lang.CharSequence, java.lang.CharSequence)' on a null object reference at com.samplersoft.alive.LiveFragment.stateUpdate(LiveFragment.java:258) at java.lang.reflect.Method.invoke(Native Method) – Avinash S Jun 21 '17 at 19:15
  • it's showing null at cmd.result (in thread method).. please go through it and help? – Avinash S Jun 21 '17 at 19:16
  • it is showing that error saying greenbot has no Subscribers! – Avinash S Jun 21 '17 at 19:26
  • Suggest to post a new question removing Bluetooth tag.. – Zakir Jun 21 '17 at 19:26
  • Btw your `cmdResult.replace("NODATA", "0")` is not going to work you should assign it to a new string:- `String cmdResult1 = cmdResult.replace("NODATA", "0")` and setText it for the no data case – Zakir Jun 21 '17 at 19:27
  • And pls accept-upvote this ans for your `startService()` fix ! – Zakir Jun 21 '17 at 19:31
  • yeah I will but right now I have only 5 reputation I need 15 to do that! – Avinash S Jun 21 '17 at 19:33
  • I think you can "accept" with even 1 – Zakir Jun 21 '17 at 19:34
  • I tried doing but it is asking 15reputations, btw thanks a lot for the help! – Avinash S Jun 21 '17 at 19:39