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 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条