2014-09-30 1 views
0

Я делаю приложение для передачи файлов на основе Bluetooth, и я не уверен, как работать с Threads здесь.AcceptThread не возвращается к Activity on bluetooth file transfer app

Когда я начинаю слушать входящие соединения на серверной части приложения, работает отлично, но поток, который я использую для выполнения этой задачи, а не блокирующий пользовательский интерфейс, не возвращается к основной активности после его вызова. Вот часть кода:

public class AcceptThread extends Thread { 

     private BluetoothServerSocket mmServerSocket; 
     public BluetoothSocket mmBlueToothSocket; 
     private final BluetoothAdapter mmBluetoothAdapter; 

     /*Accept incomming connections on the server*/ 
     public AcceptThread(BluetoothAdapter mBluetoothAdapter){ 

      BluetoothServerSocket tmp = null; 
      this.mmBluetoothAdapter = mBluetoothAdapter; 

      //works well 
      try { 
       this.mmServerSocket = mmBluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord(BluetoothConfig.mServiceName,BluetoothConfig.mUUID);    

      } catch (IOException e) { 
       mmServerSocket = tmp; 
       Log.d("AcceptThreadConstructorErr:", e.getMessage()); 
      } 

     } 

     public void run(){ 

      //while (true){   
       try { 
        mmBlueToothSocket = this.mmServerSocket.accept(); 
        Log.d("AcceptThreadRun:", "mmServerSocket reached"); 
       } catch (IOException e) {    
        Log.d("AcceptThreadRunErr:", e.getMessage()); 
        //break; 
       } 
      //}  

    //If I call the ConnectedThread part of the code here it raises an error so I am trying to call it from my Activity but is not returning there after executing the run part of this class   

     }//run 

}//AcceptThread class 


public class MainActivity extends Activity { 

private BluetoothServerSocket mmServerSocket; 
public BluetoothSocket mmBlueToothSocket; 

      @Override 
      protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      //accept to listen for incomming connections 
      AcceptThread acceptThread = new AcceptThread(bConfig.getBluetoothAdapter()); 
      acceptThread.start(); 

      //After the start execution this part is never reached!! 
      connectedThread(); 

      } 

      //Called from acceptThread once innitiated the connections listening in AcceptThread 
      public void connectedThread(){ 

      socket = acceptThread.mmBlueToothSocket; 

      if (socket == null){ 
       Log.d("acceptThread:", "socket Null in acceptThread"); 
      }    

      if (socket != null){ 

       try {  

        ConnectedThread connected = new ConnectedThread(socket); 
        connected.start(); 
        Log.d("serverConnect", "connect.start() ok"); 

       }catch (Exception e) { 
        Log.d("serverConnect:", e.getMessage()); 
       } 

      } 

     }//connectedThread 

}//Activity  

Можете ли вы сказать мне, какой компонент реализации темы мне не хватает (может быть в Handler?), Чтобы быть в состоянии достигнуть ConnectedThread части и сделать его работу? , Кажется, что нет ошибки, это только поток, выходящий и не возвращающийся к активности вызывающего абонента.

Благодаря

+1

в какой функции acceptThread.start() вызывается? вы поставили вызовы в статическом контексте? – nandeesh

+0

@nandeesh, вызов выполняется по активности, посмотрите на последнюю часть фрагмента кода. – CoderRoller

ответ

0

Для того, чтобы вернуться к деятельности с AcceptThread я использовал это в его методе выполнения

(this.mmActivity).runOnUiThread(new Runnable() { 
      public void run() {    
       ((MainActivity)mmActivity).connectedThread(); 
      } 
}); 

Где connectedThread метод был объявлен и реализован в деятельности в качестве обновленного после шоу. Спасибо.

1

EAS есть не весь код здесь мы не можем проверить.

Но я вижу что-то странное:

//accept to listen for incoming connections 
     AcceptThread acceptThread = new AcceptThread(bConfig.getBluetoothAdapter()); 
     acceptThread.start(); 

     //This part is never reached!!!! 
     Log.d("acceptThread:", "acceptThread.start() is executed"); 

Это называется в вашей деятельности? Где в вашей деятельности?

Обычно вы помещаете его как-то в метод onCreate(). Это не то, что вы показываете. В противном случае ваш код не должен компилироваться.

Действительно, я не вижу никакой другой причины, так как основная цель потока - запустить «параллельно». Итак, сразу после acceptThread.start(); вызывается, Log.d («acceptThread:», «acceptThread.start() выполняется»); должен быть выполнен. И в то же время должно быть выполнено содержание метода run вашего потока.

Кроме того, вы можете без проблем запустить свой ConnectedThread в своем AcceptThread.

Итак, я думаю, что Нандиш прав.

+0

Я забыл добавить часть OnCreate для работы, обновил ее соответствующим образом. Мне также удалось вызвать связанную часть HTTP-кода из AcceptThread с помощью метода runOnUiThread, но я не понимаю, почему я не могу вызвать его из AcceptThread без ошибки. – CoderRoller