2015-12-21 3 views
0
void beginListenForData() { 
      //final Handler handler = new Handler(); 
      final Handler handler = new Handler(Looper.getMainLooper()); 
      final byte delimiter = 10; //This is the ASCII code for a newline character 

      stopWorker = false; 
      readBufferPosition = 0; 
      readBuffer = new byte[2048]; 
      workerThread = new Thread(new Runnable() { 
       public void run() { 
        while (!Thread.currentThread().isInterrupted() && !stopWorker) { 
         try { 
          int bytesAvailable = mmInputStream.available(); 
          if (bytesAvailable > 0) { 
           byte[] packetBytes = new byte[bytesAvailable]; 
           mmInputStream.read(packetBytes); 
           for (int i = 0; i < bytesAvailable; i++) { 
            byte b = packetBytes[i]; 
            if (b == delimiter) { 
             byte[] encodedBytes = new byte[readBufferPosition]; 
             System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length); 
             final String data = new String(encodedBytes, "US-ASCII"); 
             readBufferPosition = 0; 


                       handler.post(new Runnable() { 

              public void run() { 

               //myLabel.setText(data); 
               dataArray = new String []{data}; 
               //Log.d("dataArray", data); 
              } 
             }); 

            } else { 
             readBuffer[readBufferPosition++] = b; 
            } 
           } 
          } 
         } catch (IOException ex) { 
          stopWorker = true; 
         } 
        } 
       } 
      }); 


public class Bluetooth_dataDisplay extends AppCompatActivity { 


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

     String MAC = getIntent().getStringExtra("MAC"); 
     mAdapter = BluetoothAdapter.getDefaultAdapter(); 
     BluetoothDevice bluetoothDevice = mAdapter.getRemoteDevice(MAC); 
     // Initiate a connection request in a separate thread 
     ConnectingThread t = new ConnectingThread(bluetoothDevice); 
     t.start(); 

     recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 
     recyclerView.setHasFixedSize(true); 
     layoutManager = new LinearLayoutManager(this); 
     recyclerView.setLayoutManager(layoutManager); 
     adapter = new RecyclerAdapter(dataArray); 
     recyclerView.setAdapter(adapter); 

    } 

Begindata() - это вызов в связанной теме. Я пытаюсь вернуть dataarray в Bluetooth_dataDisplay, расширяет AppCompatActivity и вызывает его в oncreate. Как отправить dataarray обратно в основное действие? Помогите любому специалисту. Я посмотрел сообщение, в котором говорилось о передаче данных потока в основной интерфейс. Но я очень новичок в этом, так что это довольно запутанно. :(Помогите пожалуйста.Как отправить данные из потока обратно в основной интерфейс?

+0

Почему вы не вместо этого используйте 'AsyncTask', он прост в обслуживании, он дает некоторые обратные вызовы метода, когда поток запускается, когда заканчивается, посередине, он также может давать re sponse. –

+0

1) создать пользовательский 'Handler' либо путем переопределения метода handleMessage, либо передачи' Handler.Callback' в конструктор 'Handler' 2) использовать:' msg = handler.obtainMessage (int what, Object obj) 'где' obj 'ваши данные 3) вызывают' msg.sendToTarget() 'или просто' handler.obtainMessage (...). sendToTarget() ' – pskink

+0

@NigamPatro Я не понимаю задачу Async. – Spotty

ответ

0

Заменить вызов обработчика под beginListenForData() функции

handler.post(new Runnable() { 
     public void run() { 
     //myLabel.setText(data); 
     dataArray = new String[]{data}; 
     //Log.d("dataArray", data); 
     } 
    }); 

с runOnUiThread()

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
      //myLabel.setText(data); 
      dataArray = new String[]{data}; 
      //Log.d("dataArray", data); 
     } 
    }); 

Все под runOnUiThread() работает на UI/Main нить.

Смежные вопросы