2016-07-07 2 views
0

Я пытаюсь играть с индикаторами выполнения. У меня есть эта (ниже) простая активность, которая запускает индикатор выполнения N раз один за другим, когда я вызываю Progress (N). Он отлично работает, но проблема, с которой я столкнулся, - это нажать кнопку «Назад». Я попадаю в mainActivity, но индикаторы выполнения (потоки) все еще работают в фоновом режиме один за другим. Как только они завершат N циклов, вызывается намерение, и все, что бы я делал, было бы прервано этим действием LOOP_OVER.Завершить работу после убийства всех нитей android

Я попытался решить это самостоятельно. Я попытался использовать переменную класса Thread (до того, как я это сделал непосредственно). И попытался прервать() его при onDestroy() или даже перед тем, как навязывается намерение, но не помогает. Как мне это сделать?

public class Loop extends Activity { 

    private ProgressBar progressBar; 
    private CircleProgress circleProgress; 
    private int progressStatus = 0; 
    private Handler handler = new Handler(); 

    private TextView myView; 
    private int started = 0, doneLoop=0; 
    private Thread th; 


    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_loop); 

     progressBar = (ProgressBar) findViewById(R.id.progressBar1); 
     circleProgress = (CircleProgress) findViewById(R.id.circle_progress); 

     myView = (TextView) findViewById(R.id.instruction); 

     progressBar.setScaleY(3f); 
     // Start long running operation in a background thread 

     Progress(3); 

    } 

    @Override 
    public void onDestroy() { 
     // Below, everything I am just 
     th.interrupt(); 
     Loop.this.finish(); 
     Thread.currentThread().interrupt(); 
     super.onDestroy(); 
    } 

    public void Progress(final int numberOfRuns){ 
//  QueView.setText(Que); 
     if(numberOfRuns == 0){ 
      th.interrupt(); 
      Intent myIntent = new Intent(Loop.this, LOOP_OVER.class); 
      startActivity(myIntent); 
      super.onDestroy(); 
      finish(); 
     } 
     th = new Thread(new Runnable() { 
      public void run() { 
       genNextSet(); 
       while (progressStatus < 100) { 
        progressStatus += 1; 
        // Update the progress bar and display the 
        //current value in the text view 
        handler.post(new Runnable() { 
         public void run() { 
          circleProgress.setProgress(progressStatus); 
          progressBar.setProgress(progressStatus); 
          textView.setText(progressStatus+"/"+progressBar.getMax()); 
         } 
        }); 
        try { 
         runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           // TODO Auto-generated method stub 

           myView.setText(Que); 
          } 
         }); 
         // Sleep for 200 milliseconds. 
         //Just to display the progress slowly 
         Thread.sleep(30); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
       progressStatus = 0; 

       Progress(numberOfRuns - 1); 
      } 
     }); 

     th.start(); 
    } 


    private void genNextSet() { 
     // so some cool here! 
    } 
} 

ответ

1

Вы можете думать о переменной класса, который является общим для всех потоков.

Попробуйте добавить что-то вроде этого:

private Boolean LOOP = true; 

затем

while (progressStatus < 100 && LOOP) { 

и

@Override 
public void onBackPressed() { 
    LOOP = false 
} 

также

if(LOOP == true){ 
    // call intent 
} 
finish(); 
+0

Мне плохо для меня. Я не мог придумать этот метод. На самом деле я не пытался много думать об этом. Великая мысль кстати. Это сработало. :) PS: Я отредактировал ответ, примите изменение, чтобы я мог принять ответ. – impossible

0

Ваша деятельность не разрушаться, если нажать «Назад» -Key, таким образом onDestroy() не будет называться.
Я бы переопределил onBackPressed(), если я, где вы.
В качестве альтернативы, вы можете попробовать поместить его в метод onPause().

+0

Tony в приведенном выше ответе предлагалось то же самое. Я попробовал, но это не помогло. Прочтите последний комментарий от меня в ответе Тони. Это настоящая проблема. – impossible

0

Вы не переопределять кнопку Назад pressed..try это

@Override 
public void onBackPressed() { 
    th.interrupt(); 
    Loop.this.finish(); 
    Thread.currentThread().interrupt(); 
    super.onBackPressed(); 
// add finish() if you want to kill current activity 
} 
+0

Я сделал это, но не помог. Я думаю, нам нужно некоторое управление потоками. Я не знаю много ни в java, ни в андроиде. Посмотри, можешь ли ты мне это пройти. – impossible

+0

У вас это пробовал с финишем()? –

+0

Да. Я попытался. – impossible

Смежные вопросы