user10665228
user10665228

Reputation:

How to get every time messages from service to activity using runOnUiThread

I have been stuck with one problem. I need some people which check a part of my code and help me with problem and critize my code (I write code but I haven't people which can say this is wrong or something in this pattern)

Generally.

My service get message from bluetooth (HC-05) and I can see values in Log.d, in service.

A part code of my service which get message.

private class ConnectedThread extends Thread{
        private final BluetoothSocket bluetoothSocket;
        private final InputStream inputStream;
        private final OutputStream outputStream;

        public ConnectedThread(BluetoothSocket socket){
            Log.d(TAG,"ConnectedThread: Starting");

            bluetoothSocket=socket;
            InputStream tmpInput = null;
            OutputStream tmpOutput = null;
            try{
                tmpInput = bluetoothSocket.getInputStream();
                tmpOutput = bluetoothSocket.getOutputStream();

            }catch (IOException e){
                e.printStackTrace();
                active=false;
            }
            inputStream=tmpInput;
            outputStream=tmpOutput;

        }

        @Override
        public void run() {
            byte[] buffer = new byte[1024];
            int bytes;
            while(active){
                try {
                    bytes = inputStream.read(buffer);
                    final String comingMsg = new String(buffer,0,bytes);
                    Log.d(TAG,"InputStream: " + comingMsg);
                    new Handler(Looper.getMainLooper()).post(new Runnable() {
                        @Override
                        public void run() {
                            Message message = new Message();
                            message.obj = comingMsg;
                            message.what = 1; // I need it to prevent NullObjReference
                            Log.d(TAG,"Handler run(): " + message.obj);
                            mHandler.sendMessage(message);
                        }
                    });
                }catch (IOException e){
                    Log.e(TAG,"Write: Error reading input." + e.getMessage());
                    active=false;
                    break;
                }
            }
        }
    ...some code is hidden because it is diploma thesis
}

The problem is get message every time from this service to another activity where all is happen. I tried a lot of things (with Threads,Looper,runOnUiThread, handleMessage and callback), checked a lot of posts in stackoverflow and I tried to combine with my project but all time I had nullobjectreference (for that i tried to use msg.what to check) , black screen when tried to move to my home activity (it is main) and update my textView or typical crash app.

Now I want only to get message from service to textview. When everything starts working fine, I want to parse string (for example 3 first chars) and send message to one of six textviews.

A part of codes from onCreate before method runThread() is started:

Log.d(TAG,"Check intent - result");
        if(getIntent().getIntExtra("result",0)==RESULT_OK){
            mDevice = getIntent().getExtras().getParcelable("bonded device");
            startConnection(mDevice,MY_UUID);
            Log.d(TAG,"Check is active service ");
            checkIfActive();;
        }

        Log.d(TAG,"Check intent - connect_to_paired");
        if(getIntent().getIntExtra("connect_to_paired",0)==RESULT_OK){
            mDevice = getIntent().getExtras().getParcelable("bonded_paired_device");
            startConnection(mDevice,MY_UUID);
            Log.d(TAG,"Check is active service ");
            checkIfActive();

        }

public void checkIfActive(){
        Log.d(TAG,"CheckIfActive: Started");
        while(myBluetoothService.active!=true) {
            Log.d(TAG,"CheckIfActive() active is "+ myBluetoothService.active);
            if (myBluetoothService.active) {
                Log.d(TAG, "CheckIfActive: Running method runOnUiThread - myBluetoothService.active is "+myBluetoothService.active);
                runThread();
            }
        }
    }

Method runThread() which should work everytime after connected with bluetooth device:

public void runThread(){
        //I used there Thread but when connection was fail,
        // method created multiply threads when I tried to connect next time
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
               handler = new Handler(Looper.getMainLooper()){
                 @Override
                 public void handleMessage(Message msg) {
                     while (true) {
                         switch (msg.what) {
                             //when is one, service has messages to send
                             case 1:
                                 String message = myBluetoothService.mHandler.obtainMessage().toString();
                                 rearLeft.setText(message);
                                 break;
                             default:
                                 super.handleMessage(msg);
                         }
                     }
                 }
               };
            }
        });

    }

UPDATE:

Is it good idea ? Maybe I can put JSON Object to service to send message and in the HomeActivity, I can try get values from JSON. Is it fast ? I send a lot of data, because bluetooth receive data of distance from 4 ultrasound sensors in 4 times in lasts until few milliseconds, everytime.

Here is screen how sees my data in service when I have debug logs.

enter image description here

Next idea, but still nothing:

HomeActivity (my main)

public void runThread(){
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //Looper.prepare();
                new Handler() {
                    @Override
                    public void handleMessage(Message msg) {
                        rearLeft.setText(msg.obj.toString()); 

                    }
                };
                //Looper.loop();
                    //Log.d(TAG, myBluetoothService.mHandler.getLooper().toString());
                    //rearLeft.setText(myBluetoothService.mHandler.getLooper().toString());

            }
        });

    }

Service which should send data from bluetooth to UI Thread is the same (Check first code).

Screen from HomeActivity where you can see 6 text views. Now I want put all text to one view which will be refresh by get next message.

enter image description here

Upvotes: 0

Views: 234

Answers (1)

user10665228
user10665228

Reputation:

Ok this post a bit help me to solve problem: Sending a simple message from Service to Activity

Maybe this link could help another people. Thanks for help, now understand why i should use broadcast receiver to do this.

Upvotes: 0

Related Questions