?? formplayer.java
字號(hào):
/**
//文檔生成日期:2006.3.28
//
//(1)概述:
//類名稱:FormPlayer
//類說明:
// 顯示播放音樂的Form界面
//所在子系統(tǒng):StreamingDemo
//
//系統(tǒng)總描述:
用兩個(gè)Player交替播放從網(wǎng)絡(luò)上下載的流媒體。
上面的代碼可以從
http://www.cnblogs.com/Files/zhengyun_ustc/StreamingDemo.rar
下載;
安裝的jar包從
http://www.cnblogs.com/Files/zhengyun_ustc/StreamingDemo-deployed.rar下載。
本文屬于討論稿,提供的僅僅是建議和測試意見。
本文還可以從
http://www.cnblogs.com/zhengyun_ustc/archive/2006/3/28/StreamingDemo.html 得到最新稿。
//(2)歷史記錄:
//創(chuàng)建人: 鄭昀(2006.3.28)
//修改歷史:
//聯(lián)系我: Google Talk >> zhengyun@gmail.com
//Blogs: http://blog.csdn.net/zhengyun_ustc/以及http://www.cnblogs.com/zhengyun_ustc
//(3)版權(quán)聲明:
//我這個(gè)版本j2me客戶端代碼僅僅允許您借鑒,但不得用于商業(yè)用途,除非得到鄭昀本人的授權(quán)。本人保留所有權(quán)利。
////////////////////////////////////////////////////////////////////*/
package com.ultrapower.view;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.media.MediaException;
import javax.microedition.media.Player;
import javax.microedition.media.PlayerListener;
import com.ultrapower.common.CommandResources;
import com.ultrapower.control.GUIController;
import com.ultrapower.model.Audio;
import com.ultrapower.model.NonInteractiveGaugeRunnable;
import com.ultrapower.model.ThreadPlayMain;
/**********************************************************
//FormPlayer
//
//Author:
//zhengyun@ultrapower 2006.3.28
//
**********************************************************/
public class FormPlayer extends Form implements PlayerListener{
private GUIController m_controller;
/*
* 命令們
*/
private Command exitCommand; // The exit command
private Command playCommand;
/*
* 線程們
*/
public ThreadPlayMain m_threadMain;
public ThreadPlayMain m_threadSecondary;
/*
* 確定當(dāng)前在播放哪一個(gè)Palyer
*/
private int m_nCurrentSequence = 0;
/*
* 界面元素們
*/
private int m_nAppendGaugeId = -1;
private NonInteractiveGaugeRunnable m_nonInteractive;
public FormPlayer(String title, GUIController control){
super(title);
System.out.println("/** Enter FormPlayer Constructor!");
m_controller = control;
this.setCommandListener(new FormListener());
exitCommand = new Command("退出應(yīng)用(Exit)", Command.SCREEN, 4);
playCommand = new Command("重來一遍(Again)", Command.SCREEN, 2);
this.addCommand(exitCommand);
this.addCommand(playCommand);
// 同時(shí)顯示進(jìn)度條
startGauge();
// 創(chuàng)建兩個(gè)線程;一個(gè)負(fù)責(zé)主播放器,一個(gè)負(fù)責(zé)從播放器
StartPlayMain();
StartPlaySecondary();
try
{
// 首先啟動(dòng)Main Player去下載音樂和預(yù)加載音樂
m_threadMain.notifyGetMusic();
m_threadMain.notifyPrefetch();
m_threadMain.notifyPlay();
// 剩下的事情就靠GUIController的消息機(jī)制了
}
catch(Exception exc)
{
////////////////////////////////////////////
// 告訴控制器出錯(cuò)了
String strError = exc.getMessage() + "/" + exc.getClass();
Object[] argvErrors = {strError};
m_controller.handleEvent(GUIController.EventID.EVENT_FORM_ERROR,
argvErrors);
////////////////////////////////////////////
}
}
/*
* 啟動(dòng)Main音樂播放線程
*/
public final void StartPlayMain()
{
try
{
// 第三個(gè)參數(shù)0代表主播放器
m_threadMain = new ThreadPlayMain(m_controller, this,
0,
CommandResources.SND_MAIN_MIN,
CommandResources.SND_MAIN_MAX);
Thread thread;
(thread = new Thread(m_threadMain)).start();
}
catch(Exception exc)
{
////////////////////////////////////////////
// 告訴控制器出錯(cuò)了
String strError = exc.getMessage() + "/" + exc.getClass();
Object[] argvErrors = {strError};
m_controller.handleEvent(GUIController.EventID.EVENT_FORM_ERROR,
argvErrors);
////////////////////////////////////////////
}
}
/*
* 啟動(dòng)Secondary音樂播放線程
*/
public final void StartPlaySecondary()
{
// 第三個(gè)參數(shù)1代表Secondary播放器
m_threadSecondary = new ThreadPlayMain(m_controller, this,
1,
CommandResources.SND_SECONDARY_MIN,
CommandResources.SND_SECONDARY_MAX);
Thread thread;
(thread = new Thread(m_threadSecondary)).start();
}
/*
* playSecondary函數(shù)總是由playerUpdate事件觸發(fā)的;
* 當(dāng)Main Player的音樂播放完畢,那么就立即播放Secondary Player的。
*/
public final void playSecondary()
{
m_threadMain.setPlaying(false);
m_nCurrentSequence = 1;
System.out.println("**play Secondary player!");
m_threadSecondary.notifyPlay();
try
{
m_controller.handleEvent(GUIController.EventID.EVENT_SECONDARY_BeginToPlay,
null);
}
catch(Exception e){
e.printStackTrace();
}
}
/*
* playMain函數(shù)總是由playerUpdate事件觸發(fā)的;
* 當(dāng)Secondary Player的音樂播放完畢,那么就立即播放Main Player的。
*/
public final void playMain()
{
m_threadSecondary.setPlaying(false);
m_nCurrentSequence = 0;
System.out.println("##play Main Player!");
m_threadMain.notifyPlay();
try
{
m_threadSecondary.notifyGetMusic();
m_threadSecondary.notifyPrefetch();
}
catch(Exception e){
e.printStackTrace();
}
}
/*
* 進(jìn)度條的函數(shù)
*/
public void startGauge()
{
if(m_nonInteractive == null)
{
System.out.println("new a NonInteractiveGaugeRunnable");
m_nonInteractive = new NonInteractiveGaugeRunnable(
"I'm playing,please just wait...", 5, 0);
new Thread(m_nonInteractive).start();
m_nAppendGaugeId = this.append(m_nonInteractive);
}
else
{
System.out.println("active last NonInteractiveGaugeRunnable");
m_nonInteractive.setValue(0);
m_nonInteractive.setStart();
}
}
public void stopGauge()
{
if(m_nonInteractive != null)
m_nonInteractive.setDone();
}
/*
* 通知Main音效和Secondary音效線程退出,之前要銷毀音樂資源
*/
public void destroyMusic() throws MediaException
{
Audio.shutdown();
m_threadMain.notifyCloseThread();
m_threadSecondary.notifyCloseThread();
}
/*
* 本類實(shí)現(xiàn)了PlayerListener接口。通過這個(gè)事件來告知媒體已經(jīng)播放完畢
*/
public void playerUpdate(Player player, String event, Object data){
System.out.println("Enter playerUpdate>>" +
event);
if(event == PlayerListener.END_OF_MEDIA){
try{
System.out.println("playerUpdate>>PlayerListener.END_OF_MEDIA");
stopGauge();
if(m_nCurrentSequence == 0)
{
playSecondary();
}
else
{
playMain();
}
startGauge();
}catch(Exception e){
e.printStackTrace();
}
}
else if(event == PlayerListener.STOPPED)
{
System.out.println("playerUpdate>>PlayerListener.STOPPED");
}
else if(event == PlayerListener.STARTED)
{
System.out.println("playerUpdate>>PlayerListener.STARTED");
}
}
/*
* 內(nèi)部監(jiān)聽器,監(jiān)聽器監(jiān)聽所有Command事件,并把事件響應(yīng)推出來讓控制器處理
*/
private class FormListener implements CommandListener{
public void commandAction(Command command, Displayable disp){
if(command == exitCommand)
{
////////////////////////////////////////////
// 告訴控制器exit
m_controller.handleEvent(GUIController.EventID.EVENT_EXIT,
null);
////////////////////////////////////////////
}
else if(command == playCommand)
{
// 通知背景音樂重新播放,不過可能需要稍等一會(huì)兒
m_threadMain.notifyPlay();
// 通知進(jìn)度條繼續(xù)跑
startGauge();
}
}
}//end inner class
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -