一段时间后检查变量的变化

时间:2017-07-19 09:10:12

标签: java android tcp

在我的项目中,我有一个 TCP服务器,在 TCP客户端向其发送包后发出声音振动,但现在我希望如果计数器来自60秒后 TCP服务器 != 0 重复声音和振动,但我不知道如何实现 IF 如果在60秒后更改计数器,则控制该功能。 可能有一个简单的解决方案,但我在android中是新的。

这是我的 Server.java 代码

public class Server {
DataBaseHandler myDB;
allert Allert;
MainActivity activity;
RecyclerViewAdapter adapterView;
Adapter adapter;
ServerSocket serverSocket;
public static int count=0;
String letto = "";
private SharedPreferences prefs;
static final int socketServerPORT = 8080;

public Server(MainActivity activity) {
    this.activity = activity;
    Thread socketServerThread = new Thread(new SocketServerThread());
    socketServerThread.start();
}

public int getPort() {
    return socketServerPORT;
}


public void onDestroy() {
    if (serverSocket != null) try {
        serverSocket.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}


private class SocketServerThread extends Thread {
    Vibrator vibrator;
    String date,ora;
    long[] pattern = {0, 1000, 500, 1000, 500, 1000};

    int lun;

    @Override
    public void run() {
        InputStream leggi;
        try {


            serverSocket = new ServerSocket(socketServerPORT);

            while (true) {
                myDB = DataBaseHandler.getInstance(activity);

                Socket socket = serverSocket.accept();
                leggi = socket.getInputStream();
                byte[] data = new byte[1000];
                lun = leggi.read(data, 0, data.length);
                letto = new String(data, "UTF-8");
                count++;
                MediaPlayer mPlay = MediaPlayer.create(activity, R.raw.gabsuono);
                mPlay.start();

                vibrator = (Vibrator) activity.getSystemService(VIBRATOR_SERVICE);
                vibrator.vibrate(pattern, -1);

                date = new SimpleDateFormat("dd-MM-yyyy").format(new Date());
                ora = new SimpleDateFormat("HH:mm:ss").format(new Date());
                myDB.insertDataServer(date, ora, letto);








                        activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                        allert.refreshing.setVisibility(View.VISIBLE);
                        prefs = activity.getSharedPreferences("MY_DATA", MODE_PRIVATE);
                        SharedPreferences.Editor edit = prefs.edit();
                        edit.putInt("counter", count);
                        edit.commit();
                        MainActivity.msg.setText(String.valueOf(count));
                        MainActivity.msg.setVisibility(View.VISIBLE);

                    }
                });
                leggi.close();


            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();

        }

    }


}

public void Parti() {
    prefs = activity.getSharedPreferences("MY_DATA", MODE_PRIVATE);
    count = prefs.getInt("counter", count);
    MainActivity.msg.setText("" + count);
    if (count == 0)
        MainActivity.msg.setVisibility(View.INVISIBLE);
    else
        MainActivity.msg.setVisibility(View.VISIBLE);


    }

}

2 个答案:

答案 0 :(得分:2)

您可以使用Handler#postDelayed此代码..

final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
      @Override
      public void run() {

        //Check something after 60 seconds

        handler.postDelayed(this, 60000); //1000ms = 1seconds * 60
      }
    }, 1); // first trigger 1ms. change this if you want to starts at 60 sec make it 60000

希望有所帮助......

答案 1 :(得分:1)

只需获取第一次振动的日期,存储它,当计数器为!= 0时,再次获取日期,然后计算两次之间的距离。如果是> 60秒,振动,更新第一个日期。重复算法。

演示简化版代码:

long date1 = -1;
while(true){    
    if(date1!= -1 && counter!=0){
        long date2 = System.currentTimeInMillis();
        if(date2-date1>60000){//60 seconds
          vibrateAgain();
          date1 = date2; //don't forget to update the date

        }        
     }

//your code ...
vibrateFirstTime();
date1 = System.currentTimeInMillis();
}