Тема в Android вызывает сбой телефона - PullRequest
3 голосов
/ 01 августа 2011

Я понятия не имею, что не получается в этом коде, потому что у меня проблемы с чтением журналов сбоев. Мы не говорим о сбое приложения, но сбой телефона, вероятно, вызван либо заблокированным потоком, либо каким-либо зависанием. Предложения приветствуются!


Справочная информация:

Когда я запускаю соединение, появляется диалоговое окно, и когда я нажимаю кнопку «Назад», диалоговое окно замирает, и через некоторое время телефон выходит из строя ...

Код:

Это нить, которая обрабатывает соединение с устройством. У меня нет проблем с подключением к устройству вообще. Что я знаю, так это то, что mmSocket.connect() работает, когда я нажимаю кнопку возврата. Думаю, проблема где-то там лежит ...

class ConnectThread extends Thread {

/**
 * 
 */
private Handler threadhandler;
private BluetoothDevice mmDevice;
private volatile BluetoothSocket mmSocket;
private Message toMain;
//      private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

public ConnectThread(Handler threadhandler, BluetoothDevice device) {

    this.threadhandler = threadhandler;
    this.mmDevice = device;


    // Get a BluetoothSocket to connect with the given BluetoothDevice
    try {
        Method m = mmDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
        mmSocket = (BluetoothSocket) m.invoke(mmDevice, 1);

    }catch (NoSuchMethodException e) {

        e.printStackTrace();
    } catch (IllegalArgumentException e) {

        e.printStackTrace();
    } catch (IllegalAccessException e) {

        e.printStackTrace();
    } catch (InvocationTargetException e) {

        e.printStackTrace();
    }

}

public void run() {
    Looper.prepare();
    try {
        // Connect the device through the socket. This will block
        // until it succeeds or throws an exception

        mmSocket.connect();

        toMain = threadhandler.obtainMessage();
        toMain.arg1 = 1;
        threadhandler.sendMessage(toMain);


    } catch (SecurityException e) {

        Log.e("SecurityExcep", "Oh noes" , e);
        toMain = threadhandler.obtainMessage();
        toMain.arg1 = 2;
        threadhandler.sendMessage(toMain);
        Log.w("MESSAGE", e.getMessage());

    }catch (IOException e) {
        //Bad connection, let's get the hell outta here
        try {
            Log.e("IOExcep", "Oh noes" , e);
            Log.w("MESSAGE", e.getMessage());

            mmSocket.close();
            toMain = threadhandler.obtainMessage();
            toMain.arg1 = 2;
            toMain.obj = e.getMessage();
            threadhandler.sendMessage(toMain);


            return;
        } catch (IOException e1) {
            Log.e("IOExcep2", "Oh noes" , e);
        }
    }
    try {
        mmSocket.close();
    } catch (IOException e) {
        Log.d("CONNECT_CONSTRUCTOR", "Unable to close the socket", e);
    }

    toMain = threadhandler.obtainMessage();
    toMain.arg1 = 3;
    threadhandler.sendMessage(toMain);

    Looper.loop();
    return;
    // Now it should be paired.. only thing to do now is let the user commit to the rest
}

/** Will cancel an in-progress connection, and close the socket */
public void cancel() {
    try {
        mmSocket.close();
    } catch (IOException e) { }
}

}

Следующий код - фрагмент кода создателя диалога, который называется d:

(...)

        case DIALOG_BT_ADDING:
        search_dialog = new ProgressDialog(this);
        search_dialog.setTitle(R.string.adding);
        search_dialog.setMessage(res.getText(R.string.bluetooth_add_accept));
        search_dialog.setIndeterminate(true);           
        search_dialog.setCancelable(true);
        search_dialog.setOnCancelListener(new OnCancelListener() {

            @Override
            public void onCancel(DialogInterface dialog) {
                Log.i("THREAD CONNECT", "Is it alive?: " + d.isAlive());
                if(d != null && d.isAlive()){
                    d.cancel();
                    //d = null;
                }
                if(d2 != null && d2.isAlive()){
                    d2.cancel(false);
                    //d2 = null;

                }
                search_dialog.dismiss();
                showDialog(DIALOG_NEW_DEVICE_FOUND);

            }
        });         
        return search_dialog;
(...)

Вот фрагмент кода, выполняющего класс ConnectThread

private void connectBluetooth(boolean nextstage, IOException e1){
    if(!nextstage){
        showDialog(DIALOG_BT_ADDING);

        d = new ConnectThread(threadhandler, selected_car.getDevice());
        d.start();

    }
    else{
        if(e1 != null){

            d2 = new BluetoothCheckThread(checkthreadhandler,mBluetoothAdapter, 
                    5000, car_bt, after_bt);
            d2.start();
            search_dialog.dismiss();
        }
        else{
            showDialog(DIALOG_BT_ADDING_FAILED);
        }
    }
}

Надеюсь, вы, ребята, можете мне помочь! Спасибо за любые отзывы

Ответы [ 3 ]

1 голос
/ 04 августа 2011

Хорошо, вы звоните BluetoothSocket.close() из того, что выглядит как поток пользовательского интерфейса.Это, вероятно, вызывает "зависание".

Когда вы говорите, что телефон "зависает", вы имеете в виду, что он перезагружается?Если это так, это полная перезагрузка (экран возвращается к тому, что происходит при первом включении телефона) или перезапуск во время выполнения (телефон обычно показывает какую-то анимацию, на устройствах Nexus, это распыление частиц с четырьмя цветами)?Если это не перезагрузка, значит, вы просто получаете диалоговое окно, позволяющее убить приложение?

В любом случае вы можете получить ссылку на поток, который вызывает BluetoothSocket.connect() и вызвать Thread.interrupt().Я не уверен, что BluetoothSocket прерван, но будем надеяться.Затем после прерывания вызовите close(), который, вероятно, не следует вызывать в главном потоке.

0 голосов
/ 06 декабря 2011

Похоже, вы звоните подключиться и закрыть на BluetoothSocket, который "нет, нет". Кажется, это вызывает тупик. Смотрите эту ссылку для получения дополнительной информации.

0 голосов
/ 01 августа 2011

попробуйте использовать dialog.setOnKeyListener(), чтобы в keyCode_BACK отменить поток. попробуйте это сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...