当使用ToneGenerator播放声音时,如果在主线程中进行播放操作,可能会导致ANR(Application Not Responding)错误。为了避免ANR错误,可以将ToneGenerator的播放操作放在一个单独的线程中进行。以下是一个示例代码,展示了如何解决这个问题:
public class MainActivity extends AppCompatActivity {
private ToneGenerator toneGenerator;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建一个单独的线程用于播放声音
Thread soundThread = new Thread(new Runnable() {
@Override
public void run() {
// 在这里进行ToneGenerator的初始化
toneGenerator = new ToneGenerator(AudioManager.STREAM_ALARM, 100);
// 播放声音
toneGenerator.startTone(ToneGenerator.TONE_CDMA_PIP, 500);
// 停止播放声音
toneGenerator.stopTone();
toneGenerator.release();
}
});
// 启动线程
soundThread.start();
}
}
在这个示例中,我们创建了一个单独的线程soundThread,用于执行ToneGenerator的播放操作。在这个线程中,我们首先进行ToneGenerator的初始化,然后调用startTone方法播放声音,最后停止播放并释放资源。这样可以确保播放操作不会阻塞主线程,从而避免了ANR错误的发生。