u010123588 2013-09-08 08:37 采纳率: 0%
浏览 1655

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

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

  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-01-31 06:59
    关注

    该代码通过创建新线程在后台播放背景音乐,但是当音乐播放完成时,在"OnCompletion()"方法中通过使当前线程休眠2秒后再次调用"playBGSound()"方法,但是调用的是主线程。


    因此,如果要保持在后台线程中,请使用Android线程池或者自定义线程池。

    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器