1

私のアプリケーションでは、このスレッドを使用して時計の秒針を回転させています。しかし、問題は、アクティビティを閉じている間、スレッドがまだ実行されていることです。デバイスのベットに影響しないようにスレッドを停止したい。

以下は、時計の秒針を回転させているアクティビティコードです。

 public class ClockActivity extends Activity implements OnClickListener{
    private Button chimeBtn;
    private ImageView img;
    private Thread myThread = null;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.clock_layout);


        Runnable runnable = new CountDownRunner();
        myThread = new Thread(runnable);
        myThread.start();

        chimeBtn = (Button) findViewById(R.id.chimeBtn);
        chimeBtn.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        switch(v.getId()){
            case R.id.chimeBtn:
                playSound(R.raw.one_bell);
                break;
        }
    }
    public void playSound(int resources){

         MediaPlayer mp = MediaPlayer.create(getApplicationContext(), resources);
            mp.start();


    }

    private void doPlay(){
        new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub

                Log.v("log_tag", "this is seocond thread");

            }
        }).start();
    }
    public void doRotate() {

        runOnUiThread(new Runnable() {
            public void run() {
                try {

                    Date dt = new Date();
                    int hours = dt.getHours();
                    int minutes = dt.getMinutes();
                    int seconds = dt.getSeconds();
                    String curTime = hours + ":" + minutes + "::" + seconds;
                    Log.v("log_tag", "Log is here Time is now" + curTime);
                    img = (ImageView) findViewById(R.id.imgsecond);
                    RotateAnimation rotateAnimation = new RotateAnimation((seconds - 1) * 6, seconds * 6,
                            Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF, 0.5f);

                    rotateAnimation.setInterpolator(new LinearInterpolator());
                    rotateAnimation.setFillAfter(true);

                    img.startAnimation(rotateAnimation);
                } catch (Exception e) {
                    Log.e("log_tag", "Error msg is " + e.toString());

                }
            }
        });
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) { 

        if (keyCode == KeyEvent.KEYCODE_BACK) {       
            System.out.println("Back Key Press");
            if (myThread != null) {

                   myThread.interrupt(); //says that the myThread should stop 
                   try{ 
                           myThread.join(); //make this myThread wait for the other myThread to  finish before returning
                           myThread = new Thread();
                           myThread = null;
                   }catch(InterruptedException ie){ 
                           //handle the case if the thread.join is interrupt 
                           //don't know if this will ever happen, if it can... throw a runtime exception?, or reinterrupt? 
                           Thread.currentThread().interrupt(); 
                           //   reinterrupt because thrown exception cleared interrupt and hope it's handled elsewhere 
                   } 

            }
            System.out.println("Back Key Press");
            return true;       
        }       
        return super.onKeyDown(keyCode, event);     
    } 

    @Override
    public void onDestroy(){

        System.out.println("OnDestroy");

        super.onDestroy();

    }

    class CountDownRunner implements Runnable {
        // @Override
        public void run() {
            while (!Thread.currentThread().isInterrupted()) {
                try {
                    // Log.v("log_tag", "Roate is going");
                    doRotate();
                    Thread.sleep(1000);
                    //doPlay();
                    } catch (InterruptedException e) 
                    {
                    // Thread.currentThread().interrupt();
                } catch (Exception e) {
                    Log.e("log_tag", "Error is " + e.toString());
                }
            }
        }
    }
}

前もって感謝します。

4

3 に答える 3

5

アクティビティでこのコードを試してください -

@Override
protected void onDestroy() {
    android.os.Process.killProcess(android.os.Process.myPid());
}

アプリケーションを終了しても、アプリケーション プロセスは実際には破棄されません。プロセスを破棄すると、すべての子プロセス (すべての子スレッド) が破棄されます。

于 2012-04-05T10:05:31.753 に答える
4

わかりました。つまり、バックグラウンドで実行されるサービスを作成したいということです。1 つのことは、サービスがバックグラウンドで実行され、デバイスのバッテリー電力を消耗する場合、サービスはスレッドの 1 つのタイプであるということです。したがって、プロセスを強制終了すると、スレッドとサービスが破壊されます。だから、あなたのスレッドを次のように止めてください-

boolean running = true;

public void run() {
   while(running) {
       // your working code...
   }
}

@Override
protected void onDestroy() {
    running = false;
}

アプリを終了すると、スレッドは停止します。もう 1 つは稼働し続けます。それがあなたのサービスです。スレッドを強制的に停止したり、中断したりしないでください。スレッドの while ループが壊れると、JVM ルールに従ってスレッドが自動的に破棄されます。それがあなたを助けることを願っています。楽しむ...

于 2012-04-06T05:23:15.540 に答える
3

myThread.join()UIスレッドは、スレッドが終了してアプリがANRになるまでブロックされるため、使用しないでください。またThread.currentThread().interrupt();、本当に悪いUIスレッドを中断しようとします。

、または(+対応する開始コールバックでスレッドを再作成する)を入力MyThread.interrupt()できますonDestroyonPauseonStop

于 2012-04-05T09:59:39.093 に答える