简体   繁体   中英

How to stop this thread in android?

In my application i am using this thread to rotate the Second hand on the clock. But the Problem is while i close the activity, the thread is still remain run. I want to stop the thread so it can not effect the Bettry of the device.

Below is my Activity code where i am rotating the Clock's Second Hand:

 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());
                }
            }
        }
    }
}

Thanks in advance.

try this code in your activity -

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

When you exit from your application, your application process is not actually destroyed. If you destroy your process, all child processes(all your child threads) will be destroyed.

Ok, that means you want to create a service that will have been running in background. One thing is that service is one type of thread, if it will run in background that will drain your device battery power. So, if you kill your process then the thread as well as your service will destroy. So, stop your thread like -

boolean running = true;

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

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

When you exit your app, the thread will stop. And the other will stay running, that is your service. Don't try to stop your thread forcefully, or suspend. It is deprecated, if your while loop of the thread breaks, then it will automatically destroy your thread according to JVM rules. Hope it will help you. Have fun...

don't myThread.join() on the UI thread since it will block until the Thread finished and your App might ANR. Also Thread.currentThread().interrupt(); will try to interrupt the UI thread which is really bad.

You can put MyThread.interrupt() in onDestroy , onPause or onStop (+ recreate the Thread in the corresponding start callback)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM