2017-07-19 85 views
1

在我的項目,我有一個TCP服務器,使聲音的振動的TCP客戶端後發送一個包,但現在我想,如果從TCP計數器服務器!= 0 60秒後,重複的聲音和振動,但我不知道如何實現IF功能CONTROLL如果計數器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); 


    } 

} 
+1

哪個變量是你想要的60秒後檢查?它是「數」嗎? – Ivan

+0

我想檢查計數變量 –

+0

你想每60秒檢查一次還是隻檢查一次60秒後? – Ivan

回答

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 

希望它可以幫助..

+0

其實這在MainActivity中工作正常,但在第一次啓動時它在60秒之前振動並且在它工作正常之後... –

+0

如果您希望它在第一個60秒內觸發,您可以在代碼的最後一行編輯1到60000。 。請參閱編輯評論:) – Rai

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(); 
} 
+0

Mh可能有一些問題,因爲60秒後沒有任何heppens,也許我必須在MainActivity中執行此代碼? –