2013-04-27 110 views
1

因此,有一個5秒的啓動畫面,但底部還有一個skip按鈕。這是飛濺如何運行。如何在activity處於onPause時停止線程?

public class Splash extends Activity implements View.OnClickListener { 

MediaPlayer splashsong; 
Button skipsplash; 

@Override 
protected void onCreate(Bundle chiefsplash) { 
    // TODO Auto-generated method stub 
    super.onCreate(chiefsplash); 
    setContentView(R.layout.splash); 

    splashsong = MediaPlayer.create(Splash.this, R.raw.jingle); 
    splashsong.start(); 
    skipsplash = (Button) findViewById(R.id.skipsplash); 

    skipsplash.setOnClickListener(this); 

    Thread splashtimer = new Thread() { 
     public void run() { 
      try { 
       sleep(5000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } finally { 
       switchactivity(); 
      } 
     } 
    }; 

    splashtimer.start(); 
} 

@Override 
public void onClick(View skipbutton) { 
    switchactivity(); 
} 

private void switchactivity() { 
    Intent aftersplash = new Intent("com.example.testapp.MENU"); 
    startActivity(aftersplash); 
} 

@Override 
protected void onPause() { 

    super.onPause(); 
    splashsong.release(); 
    finish(); 
} 

}

現在,我希望這是打skip按鈕中斷5秒等待一個選擇,我想一個線程在運行時不。因此,點擊skip按鈕後發生的情況是:從創建Activity開始經過5秒鐘,它將打開MenuActivity,無論我是否已經在那裏或其他地方。無論如何要阻止這個?

+1

會發生什麼? – 2013-04-27 02:09:56

+0

我不知道如何正確實現,我是Java新手。當我嘗試將其置於交換方法中時,此時出現錯誤。加入的是什麼? – Alex 2013-04-27 02:56:07

+0

@ Axtn95連接將使一個線程等待,直到其他完成。這裏是一個例子:http://pastebin.com/pfawvt0W – Eugene 2013-04-27 05:38:17

回答

0

而不是使用5秒的休眠間隔在循環中使用小的間隔,並使用標誌組合在任何時候都可以優雅地跳過線程。請嘗試下面的修改後的代碼。

public class Splash extends Activity implements View.OnClickListener { 

MediaPlayer splashsong; 
Button skipsplash; 
boolean skipWait = false; 

@Override 
protected void onCreate(Bundle chiefsplash) { 
// TODO Auto-generated method stub 
super.onCreate(chiefsplash); 
setContentView(R.layout.splash); 

splashsong = MediaPlayer.create(Splash.this, R.raw.jingle); 
splashsong.start(); 
skipsplash = (Button) findViewById(R.id.skipsplash); 

skipsplash.setOnClickListener(this); 

Thread splashtimer = new Thread() { 
    int waitTime = 0; 
    public void run() { 
     while(waitTime < 5000 && !skipWait) { 
      try { 
       sleep(500); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      waitTime += 500; 
     } 
     switchactivity(); 
    } 
}; 

splashtimer.start(); 
} 

@Override 
public void onClick(View skipbutton) { 
    skipWait = true; 
} 

private void switchactivity() { 
Intent aftersplash = new Intent("com.example.testapp.MENU"); 
startActivity(aftersplash); 
} 

@Override 
protected void onPause() { 

super.onPause(); 
splashsong.release(); 
finish(); 
} 
+0

我可以證實這個工作!我會研究代碼並記住你使用的方法。謝謝! – Alex 2013-04-27 21:55:25

-1

使用:

splashtimer.stop(); 

,你應該設置線程是一個全局對象。

+0

嗯我得到的不贊成,因爲以這種方式停止線程是不安全的,可以讓你的應用程序和虛擬機處於不可預知的狀態。我應該壓制它嗎? – Alex 2013-04-27 02:50:12

+0

@ Axtn95不!切勿使用停止方法。從不,它由於某種原因而被棄用。 – Eugene 2013-04-27 05:22:28

+0

好的:)我不擔心。 – Alex 2013-04-27 06:13:37

0

您可以改爲將布爾isSplashRunning設置爲true,在運行時在While(isSplashRunning){}循環中執行所有操作,並且您希望停止線程集 isSplashRunning = false; splashtimer.join();

+0

從現在的代碼中可以看出,當他睡眠5秒時,這並不會起到幫助,一旦他開始睡覺,將標誌設置爲真不會有幫助,直到睡眠結束。 – Eugene 2013-04-27 06:22:22

1

你有沒有嘗試使用一個處理程序

  Handler h = new Handler(); 
      h.postDelayed(runnable, delayMillis); 

調用switchactivity()在可運行的run方法。如果你嘗試`splashtimer.join()` 在的onClick()清除所有的回調是可運行

h.removeCallbacks(runnable);