Android sendet Daten vom Haupt-UI-Thread an einen anderen Thread

Ich muss einige Daten vom Haupt-Thread an einen anderen Thread senden. Ich habe bereits viele Materialien zu Threads, Asynctasks und Handlern gelesen, aber sie haben mich vielleicht verwirrt. Ich habe gelesen, dass ich einen Handler für meinen 'zweiten Thread' erstellen muss, damit ich Nachrichten vom Haupt-Thread an ihn senden kann (im Moment mache ich mir keine Sorgen, etwas an den Haupt-Thread zurückzusenden).

Ich benötige den zweiten Thread, um eine Verbindung zu einem Server herzustellen (über einen Socket) und ein Datum für einige Benutzerereignisse zu senden. Ich versuche es auf effiziente Weise zu tun (nicht unnötige Socket-Verbindungen öffnen / schließen). Ich frage mich also, wo ich meinen Open-Socket-Befehl setzen soll? Außerdem benötige ich in der handleMessage () -Methode meines Handlers einen Verweis auf den Socket-Ausgabestream, um Daten an den Server zu senden.

Ich habe derzeit den folgenden Code:

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();
}

Die Methode initThread () wird in der onCreate () -Methode meiner Aktivität aufgerufen.

Hier folgt der Code meiner benutzerdefinierten Handler-Klasse:

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();
            }
        }
    }
}

}

Und wieder löse ich in meiner Aktivität die sendDataToServer () -Methode aus

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);
    }       
}

Mein Verweis auf das WorkerHandler-Objekt ist jedoch immer null. Ich bin mir ziemlich sicher, dass ich ein Konzept falsch verstanden habe. Könnten Sie mir bitte einige Hinweise geben?

Danke vielmals!

Antworten auf die Frage(3)

Ihre Antwort auf die Frage