6

開始ボタンのクリックで実行可能を開始し、一時停止ボタンのクリックで停止する必要があります。スタートボタンのクリックで実行可能になる私のコードは

    // TODO Auto-generated method stub
    //while (running) {
     mUpdateTime = new Runnable() {
            public void run() { 
     sec += 1;
        if(sec >= 60) {
            sec = 0;
            min += 1;
            if (min >= 60) {
                min = 0;
                hour += 1;
            }
        }
        Min_txtvw.setText(String.format(mTimeFormat, hour, min, sec));
        mHandler.postDelayed(mUpdateTime, 1000);
            }
        };
        mHandler.postDelayed(mUpdateTime, 1000);
    //}

今、一時停止ボタンのクリックでそのランナブルを停止したい

pause_btn.setOnClickListener(新しい OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            play_btn.setVisibility(View.VISIBLE);
            pause_btn.setVisibility(View.INVISIBLE);

        }
    });

誰かが私を助けてくれることを知っている場合、一時停止ボタンのクリックで実行可能を停止するにはどうすればよいですか。

4

5 に答える 5

14

使用する

mHandler.removeCallbacksAndMessages(runnable);

一時停止ボタンをクリックします。

于 2013-04-24T09:40:32.647 に答える
9

boolean cancelledステータスを格納するフラグを保持します。false に初期化してから、停止ボタンのクリック時に true に変更します。

そして、run()メソッド内でこのフラグをチェックし続けます。

編集

上記のアプローチは通常は機能しますが、実行可能/スレッドを停止するための最も適切な方法ではありません。以下に示すように、タスクがブロックされ、フラグを確認できない状況が発生する可能性があります。

     public void run(){
        while(!cancelled){
           //blocking api call
        }
    }

タスクがブロッキング api 呼び出しを行っており、その後、キャンセル フラグが変更されたとします。ブロッキング API 呼び出しが進行中の場合、タスクはステータスの変化を確認できません。

代替の安全なアプローチ

スレッドまたはタスク (Runnable) を停止する最も信頼できる方法は、割り込みメカニズムを使用することです。割り込みは、スレッドを停止しても一貫性のない状態にならないようにするための協調メカニズムです。
私のブログでは、割り込み、リンクについて詳しく説明しました。

于 2013-04-24T09:40:23.007 に答える