【Android开发】线程与消息处理-开启一个新线程播放背景音乐

在本实例用,开启一个新的线程播放背景音乐,在音乐文件播放完毕后,暂停5秒后重新开始播放。

具体实现:

界面(只有一个"开始"按钮)
res/layout/main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/linearLayout1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="开始" />

</LinearLayout>

在res/文件夹下创建raw目录,在raw/下放置需要播放的背景音乐文件(这里放置的是flower.mp3文件)

MainActivity:

package com.example.test;  

import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity{
	private Thread thread;//声明一个线程对象
	private static MediaPlayer mp=null;//声明一个MediaPlayer对象
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button startButton=(Button)findViewById(R.id.button1);//获取开始按钮
        startButton.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				 ((Button)v).setEnabled(false);//设置按钮不可用
				 //创建一个用于播放背景音乐的线程
				 thread=new Thread(new Runnable(){

					@Override
					public void run() {
						playBGSound();//播放背景音乐

					}

				 });
				 thread.start();//开启线程
			}
		});

    }

	private void playBGSound() {
		if(mp!=null){
			mp.release();//释放资源
		}
		mp=MediaPlayer.create(MainActivity.this, R.raw.flower);
		mp.start();
		//为MediaPlayer添加播放完成事件监听
		mp.setOnCompletionListener(new OnCompletionListener() {

			@Override
			public void onCompletion(MediaPlayer mp) {
				try {
					Thread.sleep(5000);//让线程休眠5秒
                   <span style="white-space:pre">			</span>playBGSound();//重新播放音乐
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}
		});
	}

	@Override
	protected void onDestroy() {
		if(mp!=null){
			mp.stop();
			mp.release();
			mp=null;
		}
		if(thread!=null){
			thread=null;
		}
		super.onDestroy();
	}

}  

运行结果:点击开始按钮,按钮将变成不可用状态,并且开始播放背景音乐,界面如图

转载请注明出处:http://blog.csdn.net/acmman/article/details/46352827

时间: 2024-12-11 18:52:38

【Android开发】线程与消息处理-开启一个新线程播放背景音乐的相关文章

android 当在主线程里开启一个新线程 程序就崩溃

问题描述 android 当在主线程里开启一个新线程 程序就崩溃 我要实现的功能是检索SDcard里的所有txt文件我尝试过很多办法 1 不用线程 直接在主线程里检索文件 由于有循环且检索时间会超过5秒 导致黑屏然后提示未响应2 我建立一个线程让线程去检索文件当检索完毕后把检索到的文件传递给主类 主类再把检索到的文件显示在list上 但是当线程一启动程序就崩溃了3 最后我在主类里添加handler 当子线程检索完毕就sendmessage给主类 然后主类把子线程检索到的文件显示在list上但程序

android-在安卓中开启一个新线程,发现如下代码中if块是DeadCode?为什么,如何解决?

问题描述 在安卓中开启一个新线程,发现如下代码中if块是DeadCode?为什么,如何解决? new Thread(){ public void run(){ try { sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } while(hasData < 100){ progressStatus = progressStatus + (i

uiwebview-iOS开发UIWebView怎么开启一个新的标签页

问题描述 iOS开发UIWebView怎么开启一个新的标签页 类似点击a标签 target="_blank"就会开启一个新的标签页,UIWebView的显示过程及原理,有没有人知道 解决方案 http://ask.csdn.net/questions/199467

jsp页面开启一个新的线程访问session域

问题描述 jsp页面开启一个新的线程访问session域 jsp页面开启一个新的线程,新线程要执行的动作得用到session,求大神支招,能做到么? 解决方案 HttpSession session = request.getSession(); 解决方案二: 当然可以啊,就像在servlet中开启一个线程是一样的呀. 解决方案三: 可以,session就是会话的意思,你可以在页面取到他啊啊 解决方案四: 可以,只要将session对象传入即可.

启动多个工作线程-下载图片一般都是单任务伦循。但是如果每次下载图片都开启一个工作线程会导致什么?

问题描述 下载图片一般都是单任务伦循.但是如果每次下载图片都开启一个工作线程会导致什么? 如题.工作线程起多了会导致什么?会不会导致内存益出.然后崩了? 解决方案 Android 一个下载任务分为多个线程下载unity 线程下载图片 解决方案二: 首先无限制创建线程是不可能的~不同的系统给的限制可能不同:有的是1M,有的更多~但绝不会出现分配线程过多导致死机的情形~ 解决方案三: 如果需要下载多个图片,用一个线程的多首先代码编写会方便一些,当然你把线程包装成方法,倒着没多大差别.接下来就讨论多线

android中如何实现弹出一个阻塞线程的对话框?谢谢,大神们。

问题描述 android中如何实现弹出一个阻塞线程的对话框?谢谢,大神们. RT. 先说一下我的结构,我做了一个等待的Activity,所有可能耗时的操作都会跳到这个Activity.这个Activity中有一个Service层基类的引用(多态).会通过这个引用调用具体Service中的某个耗时的方法.当这个方法返回true的时候,这个页面就会关掉(finish())自己. 现在我需要在这个方法中弹出一个类似于对话框的东西,我希望这个对话框可以阻塞当前进程,等我操作完毕之后才继续执行后面的代码.

用Eclipse搭建Android开发环境并创建第一个Android项目(eclipse+android sdk)_Android

一.搭建Android开发环境 准备工作:下载Eclipse.JDK.Android SDK.ADT插件 1.安装和配置JAVA开发环境:   ①把准备好的Eclipse和JDK安装到本机上(最好安装在全英文路径下),并给JDK配置环境变量,其中JDK的变量值为JDK安装路径的根目录,如我的为:D:\Program Files\Java\jdk1.7.0_02: ②打开命令提示符(cmd),输入java -version命令,显示如下图则说明JAVA环境变量已经配置好了. 2.安装ADT插件:

用Eclipse搭建Android开发环境并创建第一个Android项目(eclipse+android sdk)

一.搭建Android开发环境 准备工作:下载Eclipse.JDK.Android SDK.ADT插件 1.安装和配置JAVA开发环境: ①把准备好的Eclipse和JDK安装到本机上(最好安装在全英文路径下),并给JDK配置环境变量,其中JDK的变量值为JDK安装路径的根目录,如我的为:D:\Program Files\Java\jdk1.7.0_02: ②打开命令提示符(cmd),输入java -version命令,显示如下图则说明JAVA环境变量已经配置好了. 2.安装ADT插件: ①打

android开发-请问一下有关httpclient一个问题

问题描述 请问一下有关httpclient一个问题 请问response.addHeader和httpget.setHeaderde有什么不同吗? 解决方案 setHeader(name, value):如果Header中没有定义则添加,如果已定义则用新的value覆盖原用value值. addHeader(name, value):如果Header中没有定义则添加,如果已定义则保持原有value不改变.http://hussion.iteye.com/blog/1456702