gpt4 book ai didi

android - 应该怎么做? (安卓)

转载 作者:行者123 更新时间:2023-11-30 04:43:39 25 4
gpt4 key购买 nike

我对如何实现某事以及应该如何完成感到困惑,因为我相信有不止一种方法;

我有一个应用程序,一开始它会建立一个到服务器的 TCP 连接,然后时不时地假装你按下一个按钮并向服务器发送一个字符串。实际上,连接(我使用过 java.net.Socket)应该在主 UI 线程(它当前所在的位置)之外的单独线程中运行。

我有一个公共(public)方法,因此当按下按钮时,将调用该方法并发送数据,但这同样是从主 UI 线程运行的。由于连接在应用程序的整个生命周期中保持不变,因此它可能应该是一个意向服务,但是您可以在意向服务中使用一个可调用的方法来通过后台连接在后台发送数据吗?

或者在 onStart() 方法中连接套接字然后在服务中实现异步任务的服务?我迷路了!

最佳答案

例如,您可以使用 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;
}
}

并在您的 Activity (MyActivity.java) 中添加:

OnClickListener myListener = new OnClickListener(){
public void onClick(View v) {
tcpThread.setData(data_to_send);
tcpThread.notify();
}
};

连接建立后,客户端会检查是否有新数据发送,如果没有,则等待通知。此外,您可能会发现 this question有用

编辑:由于评论太多,我编辑了我的答案。

您必须从某个地方启动 tcpClient 线程,对吗?所以从你的 Activity 中做到这一点。这样您将拥有线程的对象(正如我们在 myListener 中使用的那样)。关于 notify() - 当我们不是在谈论线程时这是没有意义的(如果我错了,请有人纠正我)并且它的目的是“释放”等待的线程,因为相同的对象继续执行,在这种情况下是客户端线程本身(synchronized(this))所以我们告诉它继续,就在这之前,我们将循环中的条件更改为 true (在方法 setData(String) 中)所以它现在将发送数据,并再次进入等待模式。

关于android - 应该怎么做? (安卓),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5492343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com