Android wysyła dane z głównego wątku interfejsu użytkownika do innego wątku
Muszę wysłać niektóre dane z głównego wątku do innego wątku. Przeczytałem już wiele materiałów na temat wątków, asynctasków i programów obsługi, ale może stworzyli dla mnie pewne zamieszanie. Czytałem, że muszę utworzyć Handler do mojego „drugiego wątku”, aby móc wysyłać wiadomości z głównego wątku do niego (na razie nie martwię się o wysyłanie czegokolwiek do głównego wątku).
Potrzebuję drugiego wątku do połączenia się z serwerem (przez gniazdo) i wysłania pewnej daty na niektóre zdarzenia użytkownika. Próbuję to zrobić efektywnie (nie otwieraj / nie zamykaj niepotrzebnych połączeń gniazd). Zastanawiam się, gdzie powinienem umieścić polecenie open socket? Ponadto w metodzie handleMessage () mojego programu obsługi potrzebuję odwołania do strumienia wyjściowego gniazda, aby wysłać dane do serwera.
Mam obecnie następujący kod:
protected void initThread(){
this.thread = new HandlerThread(WorkerHandler.class.getCanonicalName()){
@Override
public void run() {
super.run();
try{
handler = new WorkerHandler(getLooper());
}catch(Exception e){
e.printStackTrace();
}
}
};
this.thread.start();
}
Metoda initThread () jest wywoływana w metodzie onCreate () mojej aktywności.
Oto kod mojej niestandardowej klasy obsługi:
public class WorkerHandler extends Handler {
protected Socket socket;
protected BufferedWriter writer;
public WorkerHandler(Looper looper) throws Exception{
super(looper);
this.socket = new Socket("192.168.1.7", 5069);
this.writer = new BufferedWriter(new OutputStreamWriter(this.socket.getOutputStream(), "utf-8"));
}
public BufferedWriter getWriter(){
return this.writer;
}
public Socket getSocket(){
return this.socket;
}
@Override
public void handleMessage(Message msg) {
Draw draw = (Draw) msg.obj;
if (draw != null){
if (getWriter() != null){
try{
getWriter().write(DrawUtil.toJson(draw)+"\n");
getWriter().flush();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
}
I znowu w mojej działalności wyzwalam metodę sendDataToServer ()
protected void sendDataToServer(){
Draw draw = new Draw(getFlowType(), getID(), getSeq(), Calendar.getInstance(), startX, startY, endX, endY);
if (getWorkerHandler() != null){
Message msg = getWorkerHandler().obtainMessage();
msg.obj = draw;
getWorkerHandler().sendMessage(msg);
}
}
Ale moje odwołanie do obiektu WorkerHandler jest zawsze puste. Jestem prawie pewny, że źle zrozumiałem jakąś koncepcję ... Czy mógłbyś mi podać jakieś wskazówki?
Wielkie dzięki!