I am trying to write a Bluetooth android application.  I have used many 
ideas from the samples and the bluetooth page in the android developers 
site.

So, I put up a dialog that has the available bluetooth devices available, 
there is only one, and when I pick it the dialog goes to a method to manage 
the results of the dialog.

What I want to do is spawn a thread from this method that sits on a call 
that blocks.  I have the Thread and everything seems good, except the 
dialog won't go away until the thread has been cancelled.  But I can't 
cancel it because I am stuck in a blocking dialog.  

I have tried to create a Broadcast receiver to send myself a message, 
hoping the dialog goes away before I get the message, but that doesn't work 
either, the dialog still blocks until I remove it with a new instance that 
doesn't fork the thread.

The question is, is there a good way to delay the thread running until the 
dialog is down, whenever that is?  Or is what I am doing supposed to work 
and I have something else wrong.

        //The dialog basically unchanged from the sample
  
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            String[] deviceNames = getArguments().getStringArray("names");
            int position = getArguments().getInt("position", -1);
            if (position == -1) position = 0;
            return new AlertDialog.Builder(getActivity())
                    .setTitle(R.string.select_device)
                    .setPositiveButton(R.string.ok,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int 
which) {
                                ((BrewActivity) 
getActivity()).connectChannel();
                            }
                        })
                    .setSingleChoiceItems(deviceNames, position,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int 
which) {
                                ((BrewActivity) 
getActivity()).setDevice(which);
                            }
                        }
                    )
                    .create();
        }
    }

    //The connect channel method where I send myself the message

    private void connectChannel() { 
        Log.w(TAG, "Connect Channel.");
        mConnectIndicator.setText(mRes.getString(R.string.connected));
        mDataIndicator.setImageLevel(1);
        Intent intent = new Intent();
        intent.setAction("madigan.android.action.CONNECT");
        sendBroadcast(intent); 
    }

     //The broadcast receiver that gets the message I send myself.

    private final BroadcastReceiver mConnector = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.w(TAG, "Connect Receiver.");
            final String action = intent.getAction();
            if (action.equals("madigan.android.action.CONNECT" ) ){
                connect();
            }
        }
    };

  // The method called with the success of the broadcast

   private void connect() {
        Log.w(TAG, "Connect.");
        // Starts connection Thread.
        AcceptThread aThread = new AcceptThread();
        aThread.run();
        BluetoothServerSocket socket = connectDevice(mBluetoothAdapter, 
mDevice);
        try {
            socket.accept();
        }
        catch(IOException e){
            Log.w(TAG, "Accept with Exception.");
        }
        Log.w(TAG, "Accept with No Exception.");
    }

  // and finally the thread

    private class AcceptThread extends Thread {
        private final BluetoothServerSocket mmServerSocket;
     
        public AcceptThread() {
            // Use a temporary object that is later assigned to 
mmServerSocket,
            // because mmServerSocket is final
            BluetoothServerSocket tmp = null;
            try {
                // MY_UUID is the app's UUID string, also used by the 
client code
                tmp = 
mBluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord(mDevice.getName(), 
UUID.randomUUID());
            } catch (IOException e) { }
            mmServerSocket = tmp;
        }
     
        public void run() {
            BluetoothSocket socket = null;
            // Keep listening until exception occurs or a socket is returned
            while (true) {
                try {
                    socket = mmServerSocket.accept();
                } catch (IOException e) {
                    break;
                }
                // If a connection was accepted
                if (socket != null) {
                    // Do work to manage the connection (in a separate 
thread)
                    manageConnectedSocket(socket);
                    try {
                      mmServerSocket.close();
                    }
                    catch (IOException e){
                        break;
                    }
                    break;
                }
            }
        }
     
        /** Will cancel the listening socket, and cause the thread to 
finish */
        public void cancel() {
            try {
                mmServerSocket.close();
            } catch (IOException e) { }
        }
    }

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to