2016-05-06 5 views
1

Ich habe eine App, wo es durch eine Datei von Zahlen liest. Ein Schwellenwert ist vordefiniert und jede Zahl in der Datei wird einzeln mit dem Schwellenwert verglichen. Wenn die gelesene Zahl größer als der Schwellenwert ist, zeigen Sie eine Warnung mit einer Schaltfläche an. Wenn die Taste 2 Minuten lang nicht gedrückt wird, senden Sie eine SMS-Nachricht. Und wenn die Taste immer noch nicht für weitere zwei Minuten gedrückt wird, dann rufen Sie an.Toast-Nachricht anzeigen und eine Aktion ausführen Wenn eine bestimmte Zeitspanne abgelaufen ist

Das Bit, mit dem ich kämpfe, ist die Berechnung der verstrichenen Zeit und die Auslösung einer der beiden oben genannten Methoden, nachdem eine bestimmte Zeit verstrichen ist. Wie man es definiert und wo. Ich habe viele Beispiele mit Handlern, Timern und Runnable-Methode gesehen, die sie ohne Erfolg versucht haben. Wenn ich die App starte, passiert nichts.

Hier ist mein Code soweit, würde mich über Anregungen oder Ideen freuen.

Mit Handler

private static final int MISS_LIMIT = 1000; 
int misses = 0; 

    final Handler handler = new Handler(); 
    final Runnable timer = new Runnable() { 
     @Override 
     public void run() 
     { 
      handler.postDelayed(timer, MISS_LIMIT); 
      // user too late: increment miss counter 
      if (++misses >= MISS_LIMIT) 
      { 
       //TODO miss limit reached 
       Toast.makeText(MainActivity.this, "Time is passed", Toast.LENGTH_SHORT).show(); 
       finish(); // close this activity 
      } 
     } 
    }; 

Und den Rest des Codes:

int Threshold = 40; 

    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context); 

    File dir = Environment.getExternalStorageDirectory(); 


    File file = new File(dir, "/Numbers.txt"); 

    try 
    { 
     FileInputStream fin = new FileInputStream(file); 

     if (fin != null) 
     { 

     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fin)); 
     String line =""; 

     while((line= bufferedReader.readLine()) != null) 
     { 

      if (Integer.parseInt(line) > Threshold) 
      { 
      //store value in integer 
      int number = Integer.parseInt(line); 

      // create alert dialog 
      AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 
            builder 
      .setTitle("Alert !!") 
      .setMessage("High Temperature !!" + "\t" + number) 


      .setPositiveButton("Send SMS",new DialogInterface.OnClickListener() 
      { 
      public void onClick(DialogInterface dialog,int id) 
       { 
       // if this button is clicked, close current activity 
       MainActivity.this.finish(); 
       } 
      }); 


    AlertDialog alertDialog = builder.create(); 
              alertDialog.getWindow().setBackgroundDrawableResource(android.R.color.holo_red_light); 
     alertDialog.show(); 
     } 

    } 

    fin.close(); 
+0

Ich würde einen Blick [hier] berufen sich (http://developer.android.com/reference/java/util/concurrent/ScheduledExecutorService.html). – Mena

+0

Nehmen Sie ein boolesches Flag und klicken Sie auf "OK". Nach dem Anzeigen des Dialogs können Sie zwei 'Handler.postDelayed()' Methoden aufrufen, eine für SMS und eine für Anrufe mit verschiedenen Verzögerungen. Überprüfen Sie in beiden 'Runnables', ob das boolesche Flag wahr oder falsch ist, ob TRUE, dann senden Sie SMS oder rufen Sie sonst nichts auf. –

Antwort

0

Wahrscheinlich können Sie die folgenden Änderungen für die gleiche Arbeit machen.

Angenommen, Sie Dialog von initiateDialog Methode

void initiateDialog(){ 
    //Show Alert 
    //Your existing code for Dialog 
    AlertDialog alertDialog = builder.create(); 
    alertDialog.getWindow().setBackgroundDrawableResource(android.R.color.holo_red_light); 
    alertDialog.show(); 
    new Handler().postDelayed(new Runnable() { 

       @Override 
       public void run() { 
        buttonNotPressedFirst(); 
       } 
      }, FIRST_DELAY); 

    } 
    void buttonNotPressedFirst(){ 
     //SEND SMS 
    new Handler().postDelayed(new Runnable() { 

       @Override 
       public void run() { 
        buttonNotPressedSecond(); 
       } 
      }, SECOND_DELAY); 
    } 
    } 

    void buttonNotPressedSecond(){ 
     //Proceed with phone call 
    } 
+0

Wo sollte ich den HF platzieren? Ist es zwischen dem DialogButton.OnClickListener? Denn wenn die 'SMS senden'-Schaltfläche im Dialog nicht gedrückt wird, dann sende einen Text und mache dann einen Telefonanruf. Wenn ich den Handler nach dem 'Listener Event' platziere, wird das' postDelayed' rot angezeigt. – HShbib

+0

Der Prozess zum Anzeigen Ihrer Warnung sollte vollständig in die Methode initiateDialog() verschoben werden. Nach alertDialog.show(); , starte den ersten Handler. Als Sie anfingen, Dialog alert zu zeigen, startete Ihr erster Zähler. Wenn der Handler beendet ist, rufen Sie buttonNotPressedFirst() auf. – Stallion

+0

Also wie kann ich vermeiden, den 'SECOND_DELAY' von Anfang an zu starten, nachdem' FIRST_DELAY' beendet ist. Angenommen, der 'FIRST_DELAY' ist' 10000'. Starten Sie 'SECOND_DELAY' nach dem Ende von' FIRST_DELAY', nicht von '0'. Kann dies überhaupt erreicht werden? – HShbib

Verwandte Themen