我使用release和new重新创建每个音轨的媒体播放器。但是如何重新创建可视化工具?当我调用release并创建新的可视化工具时,我有了新的线程可视化工具,因为旧线程没有自动完成。如果我不重新创建可视化器,那么他的错误AudioSessionId。 怎么用visualizer ???有媒体播放器,如果媒体播放器确实重新创建了每个音轨吗?
例如某些代码(来自我的大应用):
public class VisualizerView extends View {
private static final String TAG = "VisualizerView";
private byte[] mBytes;
private byte[] mFFTBytes;
private Rect mRect = new Rect();
private static Visualizer mVisualizer;
private static Set<Renderer> mRenderers;
private Paint mFlashPaint = new Paint();
private Paint mFadePaint = new Paint();
public VisualizerView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs);
init();
}
public void link(MediaPlayer player)
{
if(player == null)
{
throw new NullPointerException("Cannot link to null MediaPlayer");
}
// Pass through Visualizer data to VisualizerView
Visualizer.OnDataCaptureListener captureListener = new Visualizer.OnDataCaptureListener()
{
@Override
public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes,
int samplingRate)
{
updateVisualizer(bytes);
}
@Override
public void onFftDataCapture(Visualizer visualizer, byte[] bytes,
int samplingRate)
{
updateVisualizerFFT(bytes);
}
};
// Create the Visualizer object and attach it to our media player.
if (mVisualizer==null) {
mVisualizer = new Visualizer(player.getAudioSessionId());
mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);
mVisualizer.setDataCaptureListener(captureListener, Visualizer.getMaxCaptureRate() / 2, true, true);
// Enabled Visualizer and disable when we're done with the stream
mVisualizer.setEnabled(true);
addBarGraphRenderers();
} else {
mVisualizer.setDataCaptureListener(captureListener,
Visualizer.getMaxCaptureRate() , true, true);
mVisualizer.setEnabled(true);
}}
Upd1: 我为呼叫终结重写了可视化工具,但这对我没有帮助:
public class visualizer1 extends Visualizer {
public visualizer1(int audioSession) throws UnsupportedOperationException,
RuntimeException {
super(audioSession);
}
@Override
public void finalize() {
super.finalize();
}
}
public void release() {
if (mVisualizer!=null) {
mVisualizer.release();
mVisualizer.finalize();
mVisualizer=null;
}
}
我有很多可视化器:
答案 0 :(得分:0)
解决了这个问题。当我设置mVisualizer.setEnabled(false);在发布可视化工具之前自动完成:
public void release()
{
if (mVisualizer!=null) {
mVisualizer.setEnabled(false);
mVisualizer.release();
mVisualizer=null;
}
}
UPD:我测试了我的代码很长一段时间(大约一年),发现如果我这样做了,那么很少有应用程序在“mVisualizer.release();”行上发生致命错误而崩溃。这不能使用库来跟踪,例如crashlytics。
所以我删除了“mVisualizer.setEnabled(false);”。
在Android 7.0中,我最多有3-4个Visualizer线程,这不会导致内存泄漏。
UPD2: 我找到了崩溃应用程序的原因。问题是mVisualizer.release()命令;有时它是在可视化渲染时执行的。 我添加了一个布尔变量来避免这种情况,现在崩溃消失了。享受!
private boolean release = false;
public void release() {
if (mVisualizer != null) {
if (cameraLed == true) {
barGraphRendererBottom.stopCamera();
}
if (isShown())
release = true;
else {
release = false;
mVisualizer.setEnabled(false);
mVisualizer.release();
mVisualizer = null;
}
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (release) {
release = false;
mVisualizer.setEnabled(false);
mVisualizer.release();
mVisualizer = null;
} else {
mRect.set(0, 0, getWidth(), getHeight());
if (mCanvasBitmap == null) {
mCanvasBitmap = Bitmap.createBitmap(canvas.getWidth(),
canvas.getHeight(), Config.RGB_565);
}
if (mCanvas == null) {
mCanvas = new Canvas(mCanvasBitmap);
}
canvas.drawBitmap(mCanvasBitmap, new Matrix(), null);
}
}