gpt4 book ai didi

android - TextView 不是从按钮 onClick 中绘制的

转载 作者:行者123 更新时间:2023-11-30 04:45:09 25 4
gpt4 key购买 nike

我正在尝试创建一个音乐流应用程序。到目前为止它工作得很好。我正在使用

MediaPlayer.create(thisContext, Uri.parse(PATH_TO_STREAM));

准备无限流(24x7 mp3 流)的便捷方法。它在这个调用中只挂了几秒钟,我已经巧妙地把它塞进了我的 startPlaying() 方法中。在流开始播放之前,按钮不会显示它被点击,所以一开始用户会想知道他们是点击了按钮还是错过了。所以我想更新按钮旁边的 TextView 标签,上面写着“等待...”或“缓冲”等,然后在流开始后清除它,以便用户知道他们按下了按钮 OK。即使我在调试中逐步执行此操作,标签也不会在 onClick 完成之前更新。我可以注释掉清除标签文本的最后一行,并且可以看到它设置为“正在缓冲...”。但只有在它退出 onClick 之后。这是使用媒体播放器 create() 方法的限制吗?

final Button startbutton = (Button) findViewById(R.id.Button01);
this.tvBuffering = (TextView) findViewById(R.id.tvBuffering);

startbutton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
tvBuffering.setText("Buffering...");
//do something like invalidate() here??
startPlaying(); //blocks here for a few seconds to buffer then plays.
tvBuffering.setText(" "); //clear the text since it's playing by now.
}
});

最佳答案

故意在 UI 中包含这种延迟并不是一个好主意,因为这会阻止用户在那几秒钟内尝试做的任何事情。我假设您的 startPlaying() 包括对 prepare() 以及 start() 的调用。当从不会立即可用的源(例如流)获取数据时,您应该改用 prepareAsync(),这将开始准备并立即返回,而不是阻塞直到准备完成。

您可以将回调附加到您的 MediaPlayer,然后在通过 MediaPlayer.OnPreparedListener 完成准备后采取行动

这是一个简单的例子。请注意,您的 OnClickListener 可以保持不变,只要您将 startPlaying() 方法中的 prepare() 更改为 prepareAsync() 并且从 startPlaying() 中删除 start() 调用。

startbutton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
tvBuffering.setText("Buffering...");

startPlaying(); //which should call prepareAsync() instead of prepare()
//and have no call to start()
}
});

mYourMediaPlayer.setOnPreparedListener( new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
start();
tvBuffering.setText(" ");
}
});

关于android - TextView 不是从按钮 onClick 中绘制的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5178590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com