java - 如何重复发布和接收数据但使应用程序仍然负责编辑

标签 java php android raspberry-pi android-volley

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

起初,我尝试将 POST() 函数添加到 onResponse() 函数(onRespose 调用 POST 函数,一次又一次地发出新请求),但这会卡住我的应用程序,因此我添加了每 1 毫秒调用一次函数的计时器

.

.

.

编辑后,我的应用程序与以前一样工作(仅在连接到电脑时才有效),如果我打开应用程序并且我的手机未连接到电脑,应用程序会在 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();
    }
}

同步.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);

    }
}

数据.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 并且可以添加您想要的每条消息。

关于java - 如何重复发布和接收数据但使应用程序仍然负责编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57832029/

相关文章:

android - 更改 Android SDK 管理器路径时,Eclipse Neo 无法识别 android.support.v7.app.AppCompatActivity

java - Apache HTTPClient 的 UnknownHostException

java - 在Java中为字符串添加前缀?

php - 如何替换回车

由于...CSS,PHP 邮件表单文本框无法编辑?

android - 在 Android 中绘制锦标赛支架的最佳方式

java - 为什么我的项目无法编译?

java - Spring表单标签错误(绑定(bind)结果)

php - 如何在表单提交时创建cookie?

Android 2.3.x 与谷歌图表