【发布时间】:2013-12-02 00:30:14
【问题描述】:
我需要将一些数据从主线程发送到另一个线程。我已经阅读了很多关于线程、异步任务和处理程序的材料,但也许它们给我带来了一些困惑。我读到我需要为我的“第二个线程”创建一个处理程序,以便我可以从主线程向它发送消息(现在我不担心将任何内容发送回主线程)。
我需要第二个线程连接到服务器(通过套接字)并在某些用户事件上发送一些日期。我正在尝试以有效的方式进行(不要打开/关闭不必要的套接字连接)。所以我想知道我应该把我的打开套接字命令放在哪里?此外,在我的处理程序的 handleMessage() 方法中,我需要对套接字输出流的引用才能将数据发送到服务器。
我目前有以下代码:
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();
}
我的activity的onCreate()方法中调用了方法initThread()。
下面是我的自定义处理程序类的代码:
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();
}
}
}
}
}
再一次,在我的活动中,我触发了 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);
}
}
但我对 WorkerHandler 对象的引用始终为空。我很确定我误解了一些概念......你能给我一些提示吗?
非常感谢!
【问题讨论】:
-
在您的活动中显示
getWorkerHandler()的代码。 -
感谢@DavidWasser!它实际上返回 this.handler。引用在第二个线程的 run() 方法内的 initThread() 方法中设置。
-
我看到了你的问题,只是在制定我的答案。给我几分钟。
标签: java android multithreading sockets android-asynctask