我很困惑我如何能够实现某些目标以及应该如何实现,因为我认为有多种方法;
我有一个应用程序,并且在开始时它建立了与服务器的TCP连接,然后不时地让我们假装你按下按钮并将字符串发送到服务器。真的,连接(我已经使用过java.net.Socket)应该在主UI线程(当前位置)的单独线程中运行。
我有一个公共方法,所以当按下按钮时,方法被调用,并且数据被发送但是再次从主UI线程运行。由于连接在应用程序的整个生命周期中都是恒定的,因此它可能应该是一种意向服务,但您是否可以在意图服务中使用可调用的方法通过背景连接在后台发送数据?
或者在onStart()方法中连接套接字然后在服务中实现asynctask的服务?我迷路了!
答案 0 :(得分:1)
例如,您可以使用synchronized
执行此操作(当然,这只是一个划痕,不处理任何异常):
public class SyncedTcpClient extends Thread{
synchronized boolean new_data_available = false;
String _data = null;
public void run()
{
Socket s = new Socket("127.0.0.1", 3000);
while(1)
{
synchronized(this)
{
if(new_data_available)
{
// send data
new_data_available = false;
}
else
{
wait();
}
}
}
}
public void setData(String data)
{
_date = data;
new_data_available = true;
}
}
在您的活动(MyActivity.java)中添加:
OnClickListener myListener = new OnClickListener(){
public void onClick(View v) {
tcpThread.setData(data_to_send);
tcpThread.notify();
}
};
建立连接后,客户端将检查是否有新数据可用,如果没有,则会等待通知。此外,您可能会发现this question有用
修改强> 由于评论过多,我编辑了我的答案。
你必须从某个地方启动tcpClient线程,对吧?所以从你的活动中做到这一点。这样你就可以获得线程的对象(正如我们在myListener
中使用的那样)。关于notify()
- 当我们不谈论线程时,这是没有意义的(如果我错了,请有人纠正我),它的目的是“释放”等待的线程因为同一个对象继续执行,在这种情况下是客户端线程本身(synchronized(this)
)所以我们告诉它继续,就在此之前,我们将循环中的条件更改为true(在方法setData(String)
中)所以它现在将发送数据,然后再次进入等待模式。
答案 1 :(得分:0)
您可以使用AsyncTask。在doInBackground函数中,您将发送数据,获取响应等。这将释放UI线程。在onPostExecute中,您可以使用后台任务的结果更新UI线程。