2016-03-31 8 views
1

Die Schleife friert meine App ein, aber nachdem sie fertig ist, funktioniert die App normal. Ich habe versucht, Schleife in Thread laufen und es funktionierte sehr gut ohne Einfrieren App. Aber jetzt ist das Problem, dass ich die gleiche Schleife nicht erneut ausführen kann, wenn ich die App stürzt, weil wir Thread nicht neu starten können. Ich möchte die Schleife so ausführen, dass sie die App nicht einfriert und erneut ausgeführt werden kann. Wie kann ich es tun?Wie führe ich eine Schleife, ohne meine App einzufrieren?

-Code in meiner MainActivity Klasse:

protected Thread sendthread; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

sendthread = new Thread(new Runnable() { 

    @Override 
    public void run() { 

    for(int i=0;i<amount;i++){ 

      if (status == 0){ 

       break; 

      } 

      SmsManager sms = SmsManager.getDefault(); 
     sms.sendTextMessage(phoneNumber.getText().toString(),null,messagetoSend, null, null); 

    } 

    } 
}); 


} 

Thread wird von einem Ich stoppe Faden button

start.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

     status = 1; 
     sendthread.start(); 

} 

Gestartet von status-0

+3

neuen Thread erstellen für jede Schleife. – Tokazio

+0

Erstellen Sie einen 'ExecutorService' und führen Sie dort schwere Schleifen aus. –

+0

können Sie AsyncTask verwenden –

Antwort

1

Rufen Sie die Methode so oft möchten Sie Schleife

private void loopInAnotherThread() { 
    new Thread(new Runnable() { 
     public void run() { 
      // Your loop 
     } 
    }).start(); 
} 
+0

Vielen Dank Mann! <3 Ich habe versucht, seit 2 Tagen herauszufinden. –

+1

@ShahbazTalpur Das Erstellen eines neuen Threads bei jedem Drücken des Knopfes funktioniert in diesem Fall, aber im Allgemeinen ist es eine schlechte Idee, dass ein Programm einen neuen Thread für jede Aufgabe erstellt, die im Hintergrund ausgeführt werden soll. Das Erstellen und Zerstören von Threads ist teuer. Eine "AsyncTask" (wie von Balu SKT vorgeschlagen) oder ein Thread-Pool (z. B. "ThreadPoolExecutor") wäre eine viel bessere Idee.) –

0

Einstellung eine boolesche Variable pflegen die innere zu steuern Schleife und eine äußere Endlosschleife, um das Beenden des Threads zu stoppen.

2

Versuchen Sie mit AsyncTask. Starten Sie eine Fortschrittsanzeige in onPreExecute Funktion und rufen Sie cancel in onPostExecute. Innerhalb doInBackground können Sie Schlaf nennen. Dadurch wird Ihre App nicht abgestürzt und Sie haben nicht das Gefühl, dass die App nicht reagiert.

1

Erstellen Sie eine ausführbare Datei, die den Code haben wird, der in seiner Ausführungsmethode eine Schleife ausführt. Erstellen Sie dann ein zweites Runnable, das den UI-Thread posten kann.

Runnable myRunnable = new Runnable() { 
    @Override 
public void run() { 
     while (testByte == 0) { 
      Thread.sleep(1000); // 1 Second delay 
      String updateWords = updateAuto(); // make updateAuto() return a string 
      myTextView.post(new Runnable() { 
       @Override 
       public void run() { 
         myTextView.setText(updateWords); 
       }); 
     } 
} 

Danach können Sie Ihr Thread mit dem Runnable erstellen und starten Sie es Wie so:

Thread myThread = new Thread(myRunnable); 
myThread.start(); 
Verwandte Themen