Java 如何重复发布和接收数据,但使应用程序仍然可响应

Java 如何重复发布和接收数据,但使应用程序仍然可响应,java,php,android,raspberry-pi,android-volley,Java,Php,Android,Raspberry Pi,Android Volley,我需要重复地将数据发布到php并将其取回,但要使应用程序仍然可以响应。我的代码可以工作,但一段时间后(大约1分钟),我的应用程序停止响应 起初,我试图将POST()函数添加到onResponse()函数(onResponse call POST函数,它一次又一次地发出新请求)中,但这冻结了我的应用程序,所以我添加了计时器,它每1毫秒调用一次函数 编辑后,我的应用程序的工作原理与之前相同(仅在连接到pc时工作),如果我打开应用程序,但我的手机未连接到pc,则应用程序会在1分钟后掉落,因此我仍

我需要重复地将数据发布到php并将其取回,但要使应用程序仍然可以响应。我的代码可以工作,但一段时间后(大约1分钟),我的应用程序停止响应

起初,我试图将POST()函数添加到onResponse()函数(onResponse call POST函数,它一次又一次地发出新请求)中,但这冻结了我的应用程序,所以我添加了计时器,它每1毫秒调用一次函数

编辑后,我的应用程序的工作原理与之前相同(仅在连接到pc时工作),如果我打开应用程序,但我的手机未连接到pc,则应用程序会在1分钟后掉落,因此我仍然存在与开始时相同的问题。如果有人发现错误,请告诉我在哪里。

我编辑的代码:

MainActivity.java

public类MainActivity扩展AppCompatActivity实现Sync.CallBack{
最终字符串URL=“***”;
最终字符串键=“***”;
数据;
请求队列请求队列;
文本视图文本视图;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
数据=新数据();
data.key=key;
data.pressed=“0”;
textView=findViewById(R.id.status);
requestQueue=Volley.newRequestQueue(this);
StartSync();
}
公共无效BTN单击(视图){
data.pressed=“1”;
}
@凌驾
公共void onCallBack(字符串数据){
textView.setText(数据);
}
public void StartSync(){
同步线程=新同步(此、数据、此);
thread.start();
}
}
Sync.java

公共类同步扩展线程{
私人语境;
布尔等待=假;
最终字符串URL=“***”;
公共回调侦听器;
请求队列请求队列;
公共数据;
公共接口回调{
void onCallBack(字符串数据);
}
公共同步(回调侦听器、数据、上下文){
this.listener=listener;
这个数据=数据;
this.context=上下文;
requestQueue=Volley.newRequestQueue(上下文);
};
@凌驾
公开募捐{
while(true){
等待=真;
POST();
while(wait){}
}
}
私人空缺职位(){
StringRequest StringRequest=新的StringRequest(Request.Method.POST,URL,
新的Response.Listener(){
@凌驾
公共void onResponse(字符串响应){
等待=错误;
onCallBack(响应);
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
等待=错误;
Toast.makeText(上下文,error.toString(),Toast.LENGTH_LONG.show();
}
}
){
@凌驾
受保护的映射getParams(){
Map params=新的HashMap();
参数put(“key”,data.key);
参数输入(“按下”,数据按下);
如果(data.pressed==“1”){
data.pressed=“0”;
}
返回参数;
}
};
添加(stringRequest);
}
}
Data.java

公共类数据{
按下字符串=“0”;
字符串键=”;
}

我可以给你一个如何实现这一点的例子,但你确实需要研究我将要用到的东西

创建用于发送和接收数据的线程

公共类myReceiveThread扩展线程{
公共数据侦听器;
//创建将数据传递给“活动”的接口
公共接口gotNewData(){
void gotNewDataToDisplay(字符串数据);//或int或data或其他任何内容。
}
//执行器
公共myThread(gotNewData侦听器){
this.listener=listener;
}
@凌驾
公开募捐{
while(myappisrunng==true){
//接收数据
gotNewDataToDisplay(“新数据”);
}
}
}
在主要活动中:

//在主活动中
公共类MainActivity扩展AppCompactActivity实现gotNewData{
//究竟
public void startThread(){
myReceiveThread=新的myReceiveThread(此);
thread.start();
}
@凌驾
public void gotNewDataToDisplay(字符串数据){
someTextView.setText(数据);
}
}
创建一个发送线程

public类mySendingThread扩展线程{
private BlockingQueue toSendMessages=新建BlockingQueue();
公共mySendingThread(阻止队列发送消息){
this.tosendmages=tosendmages;
}
@凌驾
公开募捐{
while(myappisrunng==true){
String message=toSendMessages.take();
//发送消息
}
}
}
主要活动

public void startSendThread(){
mySendingThread threadSend=新的mySendingThread(MessageQueue);
thread.start();
}
在mainActivity中,您需要一个
BlockingQueue MessageQueue

并且可以添加您想要的所有消息。

有一个
AsyncTask
类,它可以在后台执行操作,而不会阻塞UI线程。您可以参考我需要重复发送新数据并获取数据以在屏幕上打印它们我需要发送主线程中的数据并获取它们,但您编写的代码将只接收数据。@MenTom_CZ您的问题真的解释得不太好。我能猜出你到底在想什么。您希望将什么数据发送到php,或者它确切地来自哪里?这是一个用户输入还是什么?我需要发布关键的php来确认设备,并发送一些字符串,可以changed@MenTom_CZ然后创建两个线程,一个发送线程,一个接收线程,并将要发送的数据传递给发送线程。