问题描述
- 新线程开启的方法自动跳到主线程
-
这是课本上的一个例子,我想跟踪线程,于是加了几处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()会转到主线程里执行?因为我是在新线程里调用这个函数的呀,求大神解答。