Вызов активности из потока

Рейтинг: 2Ответов: 1Опубликовано: 15.12.2014

Доброе время суток.

Я только начинаю программировать на андроиде, так что сильно не ругайтесь.

У меня в главной активности создается поток, который вычитывает данные, которые приходят по UART (код нажатой кнопки). И в зависимости от данных мне необходимо либо выполнять какие-то действия в главной активности, либо вызвать другую активность. В новой активности тоже нужно считывать данные через UART и в зависимости от полученных данных выполнять различные действия с новой активностью (или вызывать еще одну активность).

Вот вопрос: как это правильно делается?

Обновление

Работа с UART вынесена в отдельный класс. Объект SerialPort создается в главной активности следующим образом:

mSerialPort = mApplication.getSerialPort();
mOutputStream = mSerialPort.getOutputStream();
mInputStream = mSerialPort.getInputStream();

Сам поток у меня имеет следующий вид:

public class ReadUART_Thread extends Thread {
  int size;
  byte[] mBufferRX = new byte[myBufferSize+16];
  while (!isInterrupted()) {
    size = mInputStream.read(mBufferRX);  -- это собственно считывание UART
    formationData(mBufferRX, size);   -- обработка полученных данных
  }
}

После этого в главной активности в onCreate() я создаю и запускаю поток:

mReadUART_Thread = new ReadUART_Thread();
mReadUART_Thread.start();

В зависимости от полученных данных мне необходимо создать еще одну активность. И в ней тоже надо отслеживать данные полеченные из UART

Ответы

▲ 4Принят

В Activity определить хендлер:

public Handler myHandler = new Handler() {
   @Override
   public void handleMessage(Message msg) {
      //здесь что-нибудь делаем
   }
};

из потока вызываете:

myHandler.sendEmptyMessage(0);

UPD: пишу прям тут, проверить код сейчас нет возможности.

Создаём интерфейс:

public interface HandlerInterface{
   public Handler getHandler();
}

В ваших активностях:

public class MyActivity ... implements HandlerInterface{

   @Override
   public Handler getHandler(){
      return myHandler;
   }
}

Когда вы инициализируете поток, передаёте туда ссылку на Activity, а в конструкторе что-то вроде:

HandlerInterface handler;
...
public MyClass(HandlerInterface handler){
   this.handler = handler;
}

Затем, вызывайте хендлер так:

this.handler.sendEmptyMessage(0);

В вашем случае:

public class ReadUART_Thread extends Thread {
   HandlerInterface handler;
   public ReadUART_Thread(HandlerInterface handler){
        this.handler = handler;
   }
   ...
}

А дальше this.handler.sendEmptyMessage(0); вызывайте, где надо.