2014-11-09 6 views
0

Я очень новичок в потоковом использовании в android, просто загрязняя руки. Я всегда получаю ошибки nullpointerexception в любое время, когда я пытаюсь остановить процесс onDestroy();Android stop thread 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: [email protected] 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 

Вот код, я использую в настоящее время.

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

ответ

1

Попробуйте использовать interrupt метод, чтобы полностью остановить thread вместо cancel:

newThread.interrupt(); 

Обратите внимание, что если вы interrupt Нить в /onStop, возможно, потребуется создать thread снова в onRestart/onStart.

+0

Спасибо тонну, это работало безупречно. – Rhynoboy

+0

Это решает проблему, только если мы покинем приложение. – Sam