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!

questionAnswers(3)

yourAnswerToTheQuestion