我正在做一個android項目。 我有線程在它的問題。我想在主頁按鈕按下時暫停線程,並在返回到應用程序時恢復它。當暫停和恢復線程時沒有更新UI
這是我的代碼:
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;
}
}
}
當我按下home鍵,該線程將不會停止,當我回到應用程序,用戶界面是凍結。我不明白爲什麼。
我需要的是當我按主頁按鈕的線程暫停,當我回到線程運行和UI不凍結。
我很欣賞你寫的所有幫助我的代碼。非常感謝你。
UPDATE
我已經把timer.wait()
內run()
這樣的:
@Override
public void onStart()
{
super.onStart();
if(!pause){
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);
Log.v("Timer Thread", "Thread Berjalan "+waktu);
if(waktu==0){
Log.v("Thread Timer", "Waktu Berhenti");
running = false;
}
if(pause){
synchronized (timer) {
timer.wait();
}
}
}
}
}
catch (Throwable t){
}
}//run
});//background
timer.start();
}
}//onStart
和timer.notify()
是onResume()
就像上面,當我按下家裏談到強制關閉。這裏的日誌說:
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)
我的代碼有什麼問題?
我已經把'timer.wait()'放在'run()'中,它強制關閉。請看看我的更新。對不起,我是線程新手。 – user1008497 2012-07-19 03:34:44
對不起,錯誤是我的錯。你的回答是對的。非常感謝你 – user1008497 2012-07-19 09:04:28