Android 没有';暂停和恢复线程时不更新UI

Android 没有';暂停和恢复线程时不更新UI,android,multithreading,Android,Multithreading,我现在正在做一个android项目。 我有问题的线程在它。我想暂停线程时,主页按钮按下,并恢复它时,返回到应用程序 这是我的代码: Handler handler = new Handler() { @Override public void handleMessage(Message msg) { int tempWaktu = (Integer) msg.obj; if(!status){ if(tempW

我现在正在做一个android项目。 我有问题的线程在它。我想暂停线程时,主页按钮按下,并恢复它时,返回到应用程序

这是我的代码:

Handler handler = new Handler() 
{
    @Override
    public void handleMessage(Message msg) 
    {
        int tempWaktu = (Integer) msg.obj;

        if(!status){
            if(tempWaktu < 10 ) textSec.setText("0"+tempWaktu);
            else textSec.setText(""+tempWaktu);
        }

        if(tempWaktu==0){
            stopYourActivity();
        }
    }
}; //handler

@Override
public void onStart() 
{
    super.onStart();

    timer = new Thread(new Runnable() {
        public void run() {
        try 
        {
            while(jalan){
                if(running){
                    Thread.sleep(1000);
                    waktu--;
                    Message msg = handler.obtainMessage(1, waktu);
                    handler.sendMessage(msg);
                    if(waktu==0){
                        running = false;
                    }
                }
            }
        } 
        catch (Throwable t){

        }
    }//run
    });//background
    timer.start();
}//onStart


@Override
public void onPause(){
    synchronized (timer) {
        try {
            timer.wait();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    pause = true;
}

@Override
public void onResume(){
    super.onResume();
    if(pause){
        synchronized (timer) {
            timer.notify(); textSec.postInvalidate();
            pause = false;
        } 
    }
}
timer.notify()
与上面一样位于
onResume()
中,当我按下home键时,它将强制关闭。日志上写着:

07-19 10:27:41.173: E/AndroidRuntime(2280): FATAL EXCEPTION: main
07-19 10:27:41.173: E/AndroidRuntime(2280): android.app.SuperNotCalledException: Activity {com.konsep.baby.scratch/com.konsep.baby.scratch.BabyScratchChallenge} did not call through to super.onPause()
07-19 10:27:41.173: E/AndroidRuntime(2280):     at android.app.Activity.performPause(Activity.java:3854)
07-19 10:27:41.173: E/AndroidRuntime(2280):     at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1191)
07-19 10:27:41.173: E/AndroidRuntime(2280):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2341)
07-19 10:27:41.173: E/AndroidRuntime(2280):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2311)
07-19 10:27:41.173: E/AndroidRuntime(2280):     at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2291)
07-19 10:27:41.173: E/AndroidRuntime(2280):     at android.app.ActivityThread.access$1700(ActivityThread.java:117)
07-19 10:27:41.173: E/AndroidRuntime(2280):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:938)
07-19 10:27:41.173: E/AndroidRuntime(2280):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-19 10:27:41.173: E/AndroidRuntime(2280):     at android.os.Looper.loop(Looper.java:123)
07-19 10:27:41.173: E/AndroidRuntime(2280):     at android.app.ActivityThread.main(ActivityThread.java:3683)
07-19 10:27:41.173: E/AndroidRuntime(2280):     at java.lang.reflect.Method.invokeNative(Native Method)
07-19 10:27:41.173: E/AndroidRuntime(2280):     at java.lang.reflect.Method.invoke(Method.java:507)
07-19 10:27:41.173: E/AndroidRuntime(2280):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
07-19 10:27:41.173: E/AndroidRuntime(2280):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
07-19 10:27:41.173: E/AndroidRuntime(2280):     at dalvik.system.NativeStart.main(Native Method)

我的代码有什么问题

谷歌的培训页面已经解释了这一点


当应用程序暂停时,它会“停止动画或其他可能消耗CPU的正在进行的操作。”

第一个问题是
活动的生命周期如何实际工作。当您进入主屏幕时,您当前的
活动一直进入停止状态(即
onStop()
被调用)。因此,当您返回应用程序时,将收到
onStart()
,然后是
onResume()
。现在,让我们根据这些信息检查代码中发生了什么:

  • 第一次启动时,在
    onStart()
    中创建一个新线程并启动
    onResume()
    由于布尔标志,因此不执行任何操作
  • 按HOME按钮,将调用onPause()
  • ,并在此线程上调用wait()
  • 返回应用程序,
    onStart()
    被调用,现在计时器指向一个新线程,使旧线程悬空
  • 调用
    onResume()
    ,并将
    notify()
    发送到新线程实例
  • 因此这里的问题是,您
    wait()
    的线程和您
    notify()
    的线程不是同一个对象

    第二个问题是
    wait()。从Java文档中(添加了重点):

    使调用线程等待另一个线程调用此对象的notify()或notifyAll()方法。此方法只能由拥有此对象监视器的线程调用;请参阅notify(),了解线程如何成为监视器的所有者

    线程上调用
    wait()
    不会阻止创建
    线程的线程,它会阻止调用方法的线程,在本例中,该方法位于主线程中。因此,您已经编写了一个应用程序,该应用程序在暂停期间成功地阻止了主线程,并且无法解锁它,因此出现了冻结


    如果您想使用
    wait()
    notify()
    暂停您的后台线程,您需要确保从后台线程内调用
    wait()
    (即在它的
    run()
    块内)

    我仍然不明白它和我的问题有什么关系?我已将
    timer.wait()
    放入
    run()中
    然后强制关闭。请看一下我的更新。对不起,我是线程新手。对不起,错误是我的错。你的回答是对的。非常感谢你
    07-19 10:27:41.173: E/AndroidRuntime(2280): FATAL EXCEPTION: main
    07-19 10:27:41.173: E/AndroidRuntime(2280): android.app.SuperNotCalledException: Activity {com.konsep.baby.scratch/com.konsep.baby.scratch.BabyScratchChallenge} did not call through to super.onPause()
    07-19 10:27:41.173: E/AndroidRuntime(2280):     at android.app.Activity.performPause(Activity.java:3854)
    07-19 10:27:41.173: E/AndroidRuntime(2280):     at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1191)
    07-19 10:27:41.173: E/AndroidRuntime(2280):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2341)
    07-19 10:27:41.173: E/AndroidRuntime(2280):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2311)
    07-19 10:27:41.173: E/AndroidRuntime(2280):     at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2291)
    07-19 10:27:41.173: E/AndroidRuntime(2280):     at android.app.ActivityThread.access$1700(ActivityThread.java:117)
    07-19 10:27:41.173: E/AndroidRuntime(2280):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:938)
    07-19 10:27:41.173: E/AndroidRuntime(2280):     at android.os.Handler.dispatchMessage(Handler.java:99)
    07-19 10:27:41.173: E/AndroidRuntime(2280):     at android.os.Looper.loop(Looper.java:123)
    07-19 10:27:41.173: E/AndroidRuntime(2280):     at android.app.ActivityThread.main(ActivityThread.java:3683)
    07-19 10:27:41.173: E/AndroidRuntime(2280):     at java.lang.reflect.Method.invokeNative(Native Method)
    07-19 10:27:41.173: E/AndroidRuntime(2280):     at java.lang.reflect.Method.invoke(Method.java:507)
    07-19 10:27:41.173: E/AndroidRuntime(2280):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    07-19 10:27:41.173: E/AndroidRuntime(2280):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    07-19 10:27:41.173: E/AndroidRuntime(2280):     at dalvik.system.NativeStart.main(Native Method)