2016-05-19 18 views
0

私のアプリの1つのアクティビティでは、3秒ごとに変化する画像ビューとテキストビューがあります。Androidの一時停止と再開のバックグラウンドアクティビティ

まず、これをハンドラとスレッド実行可能プログラムで設定します。それはうまく動作しますが、一時停止ボタンでremoveCallbacksを使用すると、スレッドの途中で一時停止しません。一時停止する前にスレッド実行可能ファイルを完了します。実行可能な場所にボタンがクリックされても、一時停止する必要があります。

私はasynctaskを使用することを考えましたが、どのように動作するのか分かりません。

ダウンロードするほとんどすべてのゲームを一時停止できるので、これを行う方法が必要であることは知っています。誰にもこれを行うための最善の/最も簡単な方法に関する提案はありますか?

ありがとうございます! :)

public class Workout extends AppCompatActivity { 

private String[] messages = {"1", "2", "3", "4", "5"}; 
final Handler handler = new Handler(); 
private int nextIndex; 
String mDrawableName[] = {"bodypart70", "equipment70", "settings70", "time70", "bodypart70"}; 
private int nextImage; 
ImageView image; 
private ProgressBar progressBar; 
private int progressStatus = 0; 
Runnable r = null; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.workout); 

    image = (ImageView) findViewById(R.id.exerciseImage); 
    final TextView text = (TextView)findViewById(R.id.textView4); 
    progressBar = (ProgressBar) findViewById(R.id.progressBar1); 


    //changing 
    r = new Runnable(){ 
     @Override 
     public void run(){ 
      if (messages.length > nextIndex) { 

       //change textview 
       text.setText(messages[nextIndex++]); 
       //change image 
       int resID = getResources().getIdentifier(mDrawableName[nextImage++] , "drawable", getPackageName()); 
       image.setImageResource(resID); 
       //restart progress bar 
       progressStatus = 0; 
       progress(); 
       //do it after 3 seconds 
       handler.postDelayed(this, 3000); 
      } 
     } 
    }; 

    handler.postDelayed(r, 0); 


} 



public void progress(){ 

    new Thread(new Runnable() { 

     public void run() { 
      long timerEnd = System.currentTimeMillis() + 3 * 1000; 

      while (timerEnd > System.currentTimeMillis()) { 

       progressStatus = 3 - (int) (timerEnd - System.currentTimeMillis())/1000; 
       // Update the progress bar 

       handler.post(new Runnable() { 
        public void run() { 
         progressBar.setProgress(progressStatus); 
        } 
       }); 

       try { 
        Thread.sleep(10); 
       } catch (InterruptedException e) { 
        Log.w("App", "Progress thread cannot sleep"); 
       } 
      } 
     } 
    }).start(); 

} 


public void pauseWorkout(View view){ 
    handler.removeCallbacks(r); 

} 

public void resumeWorkout(View view){ 
    handler.postDelayed(r, 0);   
} 

}

+0

あなたはヌル(handler.removeCallbacksAndMessagesを試してみました); handler.removeCallbacks(r)の代わりに。 ? –

+0

いいえ、私はしませんでした - 私は自分のコードにアクセスして、後でそれを試してみましょう。提案していただきありがとうございます! – SillyFidget

+0

これらの2つの違いを説明できますか?私はまだ学んでいます。ありがとうございました! – SillyFidget

答えて

1

あなたは一時停止ボタンを押した後、whileループあなたの進行中の()関数はまだ働いているように見えます。

以下を試してください。一時停止または再開状態にあることを示すグローバルブール値を作成します。あなたのコードの先頭にそれを置く:

boolean resume = true; 

は(進行中のあなたの中の状態を更新します)

while (resume && timerEnd > System.currentTimeMillis()) { 

ワークアウト機能を更新します。

public void pauseWorkout(View view){ 
    handler.removeCallbacks(r); 
    resume = false; 
} 

public void resumeWorkout(View view){ 
    handler.postDelayed(r, 0); 
    resume = true;   
} 
+0

これは部分的に動作します。途中でプロゲスバーを止めて再開します。問題は今、私が再開したときに、イメージビューとテキストビューが更新されたときに、それらがまだ必要でないときです。プログレスバーは3秒間、イメージビューとテキストビューは3秒後に更新されますので、これは同時に発生します。 – SillyFidget

+0

プログレスバーを最初に更新したい場合は、単にresumeWorkout()でprogress()を呼び出します。 ImageViewの更新を遅らせるには、単にhandler.postDelayed(r、delay)の遅延時間を変更してください。 resumeWorkout()にもあります。 –

+0

私は遅れて何を入れるべきか分かりません。私は 'handler.postDelayed(r、timerEnd - System.currentTimeMillis()); 'を試しましたが、textviewとimageviewを変更するのを待っていますが、プログレスバーが終了しても同期していません。私はprogressbar onPauseの進捗状況を取得するためのいくつかの方法を試みたが、私はどのように再開時にそれを実装するか分からない。 – SillyFidget

関連する問題