如何重复 post 并接收数据但让应用程序仍然负责编辑
How to repeatly post and receive data but make app stil responseable EDITED
我需要重复 post 数据到 php 并取回它们,但使应用程序仍然 responseable.My 代码工作但一段时间后(大约 1 分钟)我的应用程序停止响应。
起初我尝试将 POST() 函数添加到 onResponse() 函数(onRespose 调用 POST 函数一次又一次地发出新请求)但是这冻结了我的应用程序所以我添加每 1 毫秒调用一次函数的计时器
.
.
.
编辑后我的应用程序与以前一样工作(仅在连接到电脑时工作)如果我打开应用程序并且我的 phone 没有连接到电脑,应用程序会在 1 分钟后下降所以我仍然有同样的问题开始时。如果有人发现错误,请告诉我在哪里。
.
.
.
我编辑的代码:
.
MainActivity.java
public class MainActivity extends AppCompatActivity implements Sync.CallBack {
final String URL = "***";
final String KEY = "***";
Data data;
RequestQueue requestQueue;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
data = new Data();
data.key = KEY;
data.pressed = "0";
textView = findViewById(R.id.status);
requestQueue = Volley.newRequestQueue(this);
StartSync();
}
public void btnClick(View view) {
data.pressed = "1";
}
@Override
public void onCallBack(String data) {
textView.setText(data);
}
public void StartSync(){
Sync thread = new Sync(this,data,this);
thread.start();
}
}
Sync.java
public class Sync extends Thread{
private Context context;
boolean wait = false;
final String URL = "***";
public CallBack listener;
RequestQueue requestQueue;
public Data data;
public interface CallBack{
void onCallBack(String data);
}
public Sync(CallBack listener,Data data,Context context){
this.listener = listener;
this.data = data;
this.context = context;
requestQueue = Volley.newRequestQueue(context);
};
@Override
public void run() {
while(true){
wait = true;
POST();
while(wait){}
}
}
private void POST(){
StringRequest stringRequest = new StringRequest(Request.Method.POST, URL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
wait = false;
listener.onCallBack(response);
}
},new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
wait = false;
Toast.makeText(context,error.toString(),Toast.LENGTH_LONG).show();
}
}
){
@Override
protected Map<String,String> getParams(){
Map<String,String> params = new HashMap<String, String>();
params.put("key",data.key);
params.put("pressed",data.pressed);
if(data.pressed == "1"){
data.pressed = "0";
}
return params;
}
};
requestQueue.add(stringRequest);
}
}
Data.java
public class Data {
String pressed = "0";
String key = "";
}
好吧,我可以给你一个如何实现的例子,但你真的需要研究我将使用的东西。
创建一个线程来发送和接收数据
public class myReceiveThread extends Thread{
public gotNewData listener;
//Create an interface to pass data to Activity
public interface gotNewData(){
void gotNewDataToDisplay(String data); //or int or data or what ever.
}
//CTor
public myThread(gotNewData listener){
this.listener = listener;
}
@Override
public void run(){
while(myAppisRunnung == true){
//Receive Data
listener.gotNewDataToDisplay("New Data");
}
}
}
主要Activity:
//In Main activity
public class MainActivity extends AppCompactActiity implements gotNewData{
//what ever
public void startThread(){
myReceiveThread thread = new myReceiveThread(this);
thread.start();
}
@Override
public void gotNewDataToDisplay(String data){
someTextView.setText(data);
}
}
创建发送线程
public class mySendingThread extends Thread{
private BlockingQueue<String> toSendMessages= new BlockingQueue<>();
Public mySendingThread (BlockingQueue<String> toSendMessages){
this.toSendMessages = toSendMessages;
}
@Override
public void run(){
while(myAppisRunnung == true){
String message= toSendMessages.take();
//Send message
}
}
}
主要Activity
public void startSendThread(){
mySendingThread threadSend = new mySendingThread(MessageQueue);
thread.start();
}
在 mainActivity 中你需要一个 BlockingQueue<String> MessageQueue
并且可以添加你想要的每条消息。
我需要重复 post 数据到 php 并取回它们,但使应用程序仍然 responseable.My 代码工作但一段时间后(大约 1 分钟)我的应用程序停止响应。
起初我尝试将 POST() 函数添加到 onResponse() 函数(onRespose 调用 POST 函数一次又一次地发出新请求)但是这冻结了我的应用程序所以我添加每 1 毫秒调用一次函数的计时器
.
.
.
编辑后我的应用程序与以前一样工作(仅在连接到电脑时工作)如果我打开应用程序并且我的 phone 没有连接到电脑,应用程序会在 1 分钟后下降所以我仍然有同样的问题开始时。如果有人发现错误,请告诉我在哪里。 .
.
.
我编辑的代码:
.
MainActivity.java
public class MainActivity extends AppCompatActivity implements Sync.CallBack {
final String URL = "***";
final String KEY = "***";
Data data;
RequestQueue requestQueue;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
data = new Data();
data.key = KEY;
data.pressed = "0";
textView = findViewById(R.id.status);
requestQueue = Volley.newRequestQueue(this);
StartSync();
}
public void btnClick(View view) {
data.pressed = "1";
}
@Override
public void onCallBack(String data) {
textView.setText(data);
}
public void StartSync(){
Sync thread = new Sync(this,data,this);
thread.start();
}
}
Sync.java
public class Sync extends Thread{
private Context context;
boolean wait = false;
final String URL = "***";
public CallBack listener;
RequestQueue requestQueue;
public Data data;
public interface CallBack{
void onCallBack(String data);
}
public Sync(CallBack listener,Data data,Context context){
this.listener = listener;
this.data = data;
this.context = context;
requestQueue = Volley.newRequestQueue(context);
};
@Override
public void run() {
while(true){
wait = true;
POST();
while(wait){}
}
}
private void POST(){
StringRequest stringRequest = new StringRequest(Request.Method.POST, URL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
wait = false;
listener.onCallBack(response);
}
},new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
wait = false;
Toast.makeText(context,error.toString(),Toast.LENGTH_LONG).show();
}
}
){
@Override
protected Map<String,String> getParams(){
Map<String,String> params = new HashMap<String, String>();
params.put("key",data.key);
params.put("pressed",data.pressed);
if(data.pressed == "1"){
data.pressed = "0";
}
return params;
}
};
requestQueue.add(stringRequest);
}
}
Data.java
public class Data {
String pressed = "0";
String key = "";
}
好吧,我可以给你一个如何实现的例子,但你真的需要研究我将使用的东西。
创建一个线程来发送和接收数据
public class myReceiveThread extends Thread{
public gotNewData listener;
//Create an interface to pass data to Activity
public interface gotNewData(){
void gotNewDataToDisplay(String data); //or int or data or what ever.
}
//CTor
public myThread(gotNewData listener){
this.listener = listener;
}
@Override
public void run(){
while(myAppisRunnung == true){
//Receive Data
listener.gotNewDataToDisplay("New Data");
}
}
}
主要Activity:
//In Main activity
public class MainActivity extends AppCompactActiity implements gotNewData{
//what ever
public void startThread(){
myReceiveThread thread = new myReceiveThread(this);
thread.start();
}
@Override
public void gotNewDataToDisplay(String data){
someTextView.setText(data);
}
}
创建发送线程
public class mySendingThread extends Thread{
private BlockingQueue<String> toSendMessages= new BlockingQueue<>();
Public mySendingThread (BlockingQueue<String> toSendMessages){
this.toSendMessages = toSendMessages;
}
@Override
public void run(){
while(myAppisRunnung == true){
String message= toSendMessages.take();
//Send message
}
}
}
主要Activity
public void startSendThread(){
mySendingThread threadSend = new mySendingThread(MessageQueue);
thread.start();
}
在 mainActivity 中你需要一个 BlockingQueue<String> MessageQueue
并且可以添加你想要的每条消息。