这是课本上的一个例子,我想跟踪线程,于是加了几处Log打印,但遇到了问题:
package com.mingrisoft;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
protected static final String TAG = "MainActivity";
private Thread thread; // 声明一个线程对象
private static MediaPlayer mp = null; // 声明一个MediaPlayer对象
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Log.i("AAA",String.valueOf(Thread.currentThread().getId()) );
Button button = (Button) findViewById(R.id.button1); // 获取布局管理器中添加的“开始”按钮
button.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(); // 开启线程
// Toast.makeText(MainActivity.this, "运行的线程有:"+Thread.currentThread().getName(), Toast.LENGTH_SHORT).show();
// Log.i(TAG, Thread.currentThread().getName());
}
});
}
// 播放背景音乐
private void playBGSound() {
Log.i(TAG, String.valueOf(Thread.currentThread().getId()));
if (mp != null) {
mp.release(); // 释放资源
}
mp = MediaPlayer.create(MainActivity.this, R.raw.dang);
mp.start(); // 开始播放
// 为MediaPlayer添加播放完成事件监听器
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
try {
Thread.sleep(2000); // 让当前线程休眠2秒钟
playBGSound(); // 重新播放音乐,回到主线程里
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
@Override
protected void onDestroy() {
if (mp != null) {
mp.stop(); // 停止播放
mp.release(); // 释放资源
mp = null;
}
if (thread != null) {
thread = null;
}
super.onDestroy();
}
}
运行结果先后是 153,1,1,1,(重复是1)。不知道为什么onCompletion()方法里,在新线程休眠2s后playBGSound()会转到主线程里执行?因为我是在新线程里调用这个函数的呀,求大神解答。