Вы можете использовать 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();
}
};
после того, как соединение установлено, клиент проверит, доступны ли новые данные для отправки, и, если нет, дождется уведомления. Кроме того, вы можете найти этот вопрос полезным
EDIT:
Поскольку комментариев слишком много, я отредактировал свой ответ.
Вы должны откуда-то запустить поток tcpClient, верно? Так что делай это из своей деятельности. Таким образом, у вас будет объект потока (как мы его использовали в myListener
). относительно notify()
- это бессмысленно, когда мы не говорим о потоках (если я ошибаюсь, пожалуйста, кто-нибудь исправит меня), и его цель состоит в том, чтобы "освободить" ожидающие потоки из-за того, что один и тот же объект продолжает выполняться, в данном случае это сам клиентский поток (synchronized(this)
), поэтому мы просим его продолжить, и непосредственно перед этим мы изменяем условие в цикле на истинное (в методе setData(String)
), чтобы он теперь отправлял данные и снова перейдите в режим ожидания.