2 u010123588 u010123588 于 2013.09.08 16:37 提问

新线程开启的方法自动跳到主线程

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!