Search code examples
javaandroidmultithreadingdestroy

Android stop thread onDestroy


I am very new to threading in android,just getting my hands dirty. I keep getting nullpointerexception errors anytime I try stopping the process onDestroy();

Logcat

11-09 08:23:46.776: W/dalvikvm(2869): threadid=1: thread exiting with uncaught exception (group=0x41ec6e48)
11-09 08:23:46.796: E/AndroidRuntime(2869): FATAL EXCEPTION: main
11-09 08:23:46.796: E/AndroidRuntime(2869): Process: com.rhynoapplications.threadingtutorial, PID: 2869
11-09 08:23:46.796: E/AndroidRuntime(2869): java.lang.RuntimeException: Unable to destroy activity {com.rhynoapplications.threadingtutorial/com.rhynoapplications.threadingtutorial.MainActivity}: java.lang.NullPointerException
11-09 08:23:46.796: E/AndroidRuntime(2869):     at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3514)
11-09 08:23:46.796: E/AndroidRuntime(2869):     at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3532)
11-09 08:23:46.796: E/AndroidRuntime(2869):     at android.app.ActivityThread.access$1400(ActivityThread.java:139)
11-09 08:23:46.796: E/AndroidRuntime(2869):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1253)
11-09 08:23:46.796: E/AndroidRuntime(2869):     at android.os.Handler.dispatchMessage(Handler.java:102)
11-09 08:23:46.796: E/AndroidRuntime(2869):     at android.os.Looper.loop(Looper.java:136)
11-09 08:23:46.796: E/AndroidRuntime(2869):     at android.app.ActivityThread.main(ActivityThread.java:5105)
11-09 08:23:46.796: E/AndroidRuntime(2869):     at java.lang.reflect.Method.invokeNative(Native Method)
11-09 08:23:46.796: E/AndroidRuntime(2869):     at java.lang.reflect.Method.invoke(Method.java:515)
11-09 08:23:46.796: E/AndroidRuntime(2869):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
11-09 08:23:46.796: E/AndroidRuntime(2869):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
11-09 08:23:46.796: E/AndroidRuntime(2869):     at dalvik.system.NativeStart.main(Native Method)
11-09 08:23:46.796: E/AndroidRuntime(2869): Caused by: java.lang.NullPointerException
11-09 08:23:46.796: E/AndroidRuntime(2869):     at com.rhynoapplications.threadingtutorial.MainActivity.onDestroy(MainActivity.java:181)
11-09 08:23:46.796: E/AndroidRuntime(2869):     at android.app.Activity.performDestroy(Activity.java:5447)
11-09 08:23:46.796: E/AndroidRuntime(2869):     at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1117)
11-09 08:23:46.796: E/AndroidRuntime(2869):     at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3501)
11-09 08:23:46.796: E/AndroidRuntime(2869):     ... 11 more
11-09 08:25:25.566: I/Process(2869): Sending signal. PID: 2869 SIG: 9
11-09 08:25:31.086: I/ActivityManager(4797): Timeline: Activity_idle id: android.os.BinderProxy@42f042b0 time:120024491
11-09 08:25:31.706: I/ViewRootImpl(4797): ViewRoot's KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_BACK, scanCode=0, metaState=0, flags=0x48, repeatCount=0, eventTime=120025111, downTime=120025111, deviceId=-1, source=0x101 } to com.android.internal.policy.impl.PhoneWindow$DecorView{42f12b08 V.E..... R....... 0,0-1080,1776}
11-09 08:25:31.796: I/ViewRootImpl(4797): ViewRoot's KeyEvent { action=ACTION_UP, keyCode=KEYCODE_BACK, scanCode=0, metaState=0, flags=0x48, repeatCount=0, eventTime=120025202, downTime=120025111, deviceId=-1, source=0x101 } to com.android.internal.policy.impl.PhoneWindow$DecorView{42f12b08 V.E..... R....... 0,0-1080,1776}
11-09 08:25:32.396: D/AndroidRuntime(4797): Shutting down VM
11-09 08:25:32.396: W/dalvikvm(4797): threadid=1: thread exiting with uncaught exception (group=0x41ec6e48)
11-09 08:25:32.396: E/AndroidRuntime(4797): FATAL EXCEPTION: main
11-09 08:25:32.396: E/AndroidRuntime(4797): Process: com.rhynoapplications.threadingtutorial, PID: 4797
11-09 08:25:32.396: E/AndroidRuntime(4797): java.lang.RuntimeException: Unable to destroy activity {com.rhynoapplications.threadingtutorial/com.rhynoapplications.threadingtutorial.MainActivity}: java.lang.NullPointerException
11-09 08:25:32.396: E/AndroidRuntime(4797):     at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3514)
11-09 08:25:32.396: E/AndroidRuntime(4797):     at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3532)
11-09 08:25:32.396: E/AndroidRuntime(4797):     at android.app.ActivityThread.access$1400(ActivityThread.java:139)
11-09 08:25:32.396: E/AndroidRuntime(4797):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1253)
11-09 08:25:32.396: E/AndroidRuntime(4797):     at android.os.Handler.dispatchMessage(Handler.java:102)
11-09 08:25:32.396: E/AndroidRuntime(4797):     at android.os.Looper.loop(Looper.java:136)
11-09 08:25:32.396: E/AndroidRuntime(4797):     at android.app.ActivityThread.main(ActivityThread.java:5105)
11-09 08:25:32.396: E/AndroidRuntime(4797):     at java.lang.reflect.Method.invokeNative(Native Method)
11-09 08:25:32.396: E/AndroidRuntime(4797):     at java.lang.reflect.Method.invoke(Method.java:515)
11-09 08:25:32.396: E/AndroidRuntime(4797):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
11-09 08:25:32.396: E/AndroidRuntime(4797):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
11-09 08:25:32.396: E/AndroidRuntime(4797):     at dalvik.system.NativeStart.main(Native Method)
11-09 08:25:32.396: E/AndroidRuntime(4797): Caused by: java.lang.NullPointerException
11-09 08:25:32.396: E/AndroidRuntime(4797):     at com.rhynoapplications.threadingtutorial.MainActivity.onDestroy(MainActivity.java:180)
11-09 08:25:32.396: E/AndroidRuntime(4797):     at android.app.Activity.performDestroy(Activity.java:5447)
11-09 08:25:32.396: E/AndroidRuntime(4797):     at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1117)
11-09 08:25:32.396: E/AndroidRuntime(4797):     at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3501)
11-09 08:25:32.396: E/AndroidRuntime(4797):     ... 11 more

Here is the code I'm using currently.

class MyThreadRunner extends Thread {
        // @Override
     int count = 0;
     boolean stopThread = false;
        public void run() {
            while (count < 90 && !stopThread) {
            try {
                if(count >= 90){
                    stopThread = true;
                }
                //500 is half a second...
                int sleepTime = count < 80 ? 10 : 30;
                Thread.sleep(sleepTime);
                count += 1;
                 progressBar.setProgress(count);
                 bar.setProgress(count);
                 progressBar.setText(count + "%");
            } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        }
        };

        public void cancel(){
            stopThread = true;
        }
 }; 

@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    newThread.cancel();
    super.onDestroy();
}

Solution

  • Try to use interrupt method to fully stop the thread instead of cancel :

    newThread.interrupt();
    

    Note that if you interrupt the Thread in onPause/onStop, you might need to create the thread again in onRestart/onStart.