2016-07-07 28 views
0

プログレスバーを再生しようとしています。プログレス(N)を呼び出すと、プログレスバーを次々とN回実行するこの(以下の)簡単なアクティビティがあります。それは素晴らしい仕事ですが、私が直面している問題は、私が戻るボタンを押した場合です。私はmainActivityに入りますが、進捗バー(スレッド)はバックグラウンドで次々に実行されています。 N個のループを終えると、その意図が呼び出され、私がしていることはこのLOOP_OVERアクティビティによって中断されます。すべてのスレッドを終了した後にアクティビティを終了します。

私はこれを私自身で解決しようとしました。 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

私は悪い気分です。私はこの方法を考えることができませんでした。実際には、私はそれについて懸命に考えようとしなかった。素晴らしい考えbtw。出来た。 :) PS:私は答えを編集して、私が答えを受け入れることができるように編集を受け入れました。 – impossible

0

あなたは「戻る」-keyを押すと、あなたの活動は、このようにonDestroy()が呼び出されることはありません、破壊されません。
あなたがどこにいたら私はonBackPressed()を上書きします。
また、onPause()の方法に入れてみることもできます。

+0

トニー上記の答えは同じことを示唆しています。私はそれを試みたが、それは助けにはならなかった。トニーの答えで私の最後のコメントを読んでください。それが本当の問題です。 – 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やAndroidにはあまり知られていません。あなたが私にそれを手に入れることができるかどうか見てください。 – impossible

+0

あなたはfinish()で試してみましたか? –

+0

はい。私は試しました。 – impossible

関連する問題