Android 进度条不动
我有一个播放/录制样本的音频应用程序。我在UI上放了一个进度条,但是当播放样本时,进度条不会移动,或者似乎会随着样本的增加而增加。我如何让它移动Android 进度条不动,android,progress-bar,Android,Progress Bar,我有一个播放/录制样本的音频应用程序。我在UI上放了一个进度条,但是当播放样本时,进度条不会移动,或者似乎会随着样本的增加而增加。我如何让它移动 mProgress = (ProgressBar) findViewById(R.id.progressBar1); // final long trackDuration = (musicLength/44100)*1000; // track duration in millisec // Sta
mProgress = (ProgressBar) findViewById(R.id.progressBar1);
// final long trackDuration = (musicLength/44100)*1000; // track duration in millisec
// Start lengthy operation in a background thread
new Thread(new Runnable() {
public void run() {
//Log.i("music length = ", trackDuration+"");
while (mProgressStatus < musicLength) {
mProgressStatus = audioTrack.write(music, 0, musicLength);
// Update the progress bar
mHandler.post(new Runnable() {
public void run() {
mProgress.setProgress(mProgressStatus);
}
});
}
}
}).start();
mProgress=(ProgressBar)findviewbyd(R.id.progressBar1);
//最终长音轨持续时间=(音乐长度/44100)*1000;//跟踪持续时间(毫秒)
//在后台线程中启动冗长的操作
新线程(newrunnable()){
公开募捐{
//Log.i(“music length=,trackDuration+”);
同时(mProgressStatus<音乐长度){
mProgressStatus=音轨写入(音乐,0,音乐长度);
//更新进度条
mHandler.post(新Runnable(){
公开募捐{
mProgress.setProgress(mProgressStatus);
}
});
}
}
}).start();
您需要更新UI线程(主要活动类线程)中的进度条,而不是通过其他线程。您需要在UI线程中创建一个处理程序,并通过其他线程向该处理程序发送消息。Android就是一个例子。请务必展开底部显示“带有第二个线程的示例ProgressDialog”的部分,因为这解释了我对示例的回答。您需要更新UI线程(主要活动类线程)中的进度条,而不是通过其他线程。您需要在UI线程中创建一个处理程序,并通过其他线程向该处理程序发送消息。Android就是一个例子。请务必展开底部显示“带有第二个线程的示例ProgressDialog”的部分,因为这解释了我对示例的回答。正如Hakan所建议的,您需要在UI线程中执行所有UI更新。因为您已经有了一个处理程序
,所以您只需要覆盖handleMessage()
方法并在那里执行UI更新。您的代码将类似于:
private static final int PROGRESS_UPDATE = 0;
...
mProgress = (ProgressBar) findViewById(R.id.progressBar1);
// final long trackDuration = (musicLength/44100)*1000; // track duration in millisec
// Start lengthy operation in a background thread
new Thread(new Runnable() {
public void run() {
//Log.i("music length = ", trackDuration+"");
while (mProgressStatus < musicLength) {
mProgressStatus = audioTrack.write(music, 0, musicLength);
// Update the progress bar
Message msg = Message.obtain();
msg.what = PROGRESS_UPDATE;
msg.arg1 = mProgressStatus;
mHandler.sendMessage(msg);
}
}
}).start();
...
Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch(msg.what){
case PROGRESS_UPDATE:
mProgress.setProgress(msg.arg1);
break;
default:
Log.e("MyTag","Unsupported message type");
break;
}
}
}
private static final int PROGRESS\u UPDATE=0;
...
mProgress=(ProgressBar)findViewById(R.id.progressBar1);
//最终长音轨持续时间=(音乐长度/44100)*1000;//跟踪持续时间(毫秒)
//在后台线程中启动冗长的操作
新线程(newrunnable()){
公开募捐{
//Log.i(“music length=,trackDuration+”);
同时(mProgressStatus<音乐长度){
mProgressStatus=音轨写入(音乐,0,音乐长度);
//更新进度条
Message msg=Message.get();
msg.what=进度\更新;
msg.arg1=mProgressStatus;
mHandler.sendMessage(msg);
}
}
}).start();
...
Handler mHandler=新处理程序(){
@凌驾
公共无效handleMessage(消息消息消息){
开关(msg.what){
个案进展(修订):
mProgress.setProgress(msg.arg1);
打破
违约:
Log.e(“MyTag”,“不支持的消息类型”);
打破
}
}
}
好的,谢谢你,戴夫。我已经从蒸汽模式改为静态模式。在调用play on the track之前,我还将数据写入了曲目。我在处理进度条更新的runnable中调用了play。应用程序播放音频样本,但进度条仍不移动。我将在下面发布显示AMMENDENTS的代码。你知道为什么progressbar没有移动吗
// Get the length of the audio stored in the file (16 bit so 2 bytes per short)
// and create a short array to store the recorded audio.
musicLength = (int)(file.length()/2);
final short[] music = new short[musicLength];
Log.i("filename length", file.length()+""+file.getName());
try {
// Create a DataInputStream to read the audio data back from the saved file.
InputStream is = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(is);
DataInputStream dis = new DataInputStream(bis);
// Read the file into the music array.
int i = 0;
while (dis.available() > 0) {
//music[musicLength-1-i] = dis.readShort();
music[i] = dis.readShort();
i++;
}
Log.i("buffer with "+ file.getName(), music.length+" passed in from array");
// Close the input streams.
dis.close();
// Create a new AudioTrack object using the same parameters as the AudioRecord
// object used to create the file.
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
44100,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
musicLength,
AudioTrack.MODE_STATIC);
Log.i("audio instance = ", ""+audioTrack.getState());
// Start playback
//audioTrack.play();
mProgress = (ProgressBar) findViewById(R.id.progressBar1);
// final long trackDuration = (musicLength/44100)*1000; // track duration in millisec
// Start lengthy operation in a background thread
new Thread(new Runnable() {
public void run() {
//Log.i("music length = ", trackDuration+"");
while (mProgressStatus < musicLength) {
mProgressStatus = audioTrack.write(music, 0, musicLength);
// Update the progress bar
mHandler.post(new Runnable() {
public void run() {
audioTrack.play();
mProgress.setProgress(mProgressStatus);
}
});
Message msg = Message.obtain();
msg.what = PROGRESS;
msg.arg1 = mProgressStatus;
mHandler.sendMessage(msg);
}
}
}).start();
mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch(msg.what){
case PROGRESS:
mProgress.setProgress(msg.arg1);
break;
default:
Log.e("MyTag","Unsupported message type");
break;
}
}
};
} catch (Exception e) {
e.printStackTrace();
Log.e("AudioTrack","Playback Failed");
}
}
//获取存储在文件中的音频长度(16位,每短2字节)
//并创建一个短阵列来存储录制的音频。
musicLength=(int)(file.length()/2);
最终短片[]音乐=新短片[音乐长度];
Log.i(“文件名长度”,file.length()+“”+file.getName());
试一试{
//创建DataInputStream以从保存的文件读回音频数据。
InputStream is=新文件InputStream(文件);
BufferedInputStream bis=新的BufferedInputStream(is);
DataInputStream dis=新的DataInputStream(bis);
//将文件读入音乐阵列。
int i=0;
而(dis.available()>0){
//音乐[音乐长度-1-i]=dis.readShort();
音乐[i]=dis.readShort();
i++;
}
Log.i(“从数组传入的带“+file.getName(),music.length+”的缓冲区”);
//关闭输入流。
dis.close();
//使用与录音相同的参数创建新的AudioTrack对象
//用于创建文件的对象。
audioTrack=新的audioTrack(AudioManager.STREAM_MUSIC,
44100,
AudioFormat.CHANNEL\u配置\u单声道,
AudioFormat.ENCODING_PCM_16位,
音乐长度,
音频跟踪模式(静态);
Log.i(“audio instance=”,“”+audioTrack.getState());
//开始播放
//音轨播放();
mProgress=(ProgressBar)findViewById(R.id.progressBar1);
//最终长跟踪持续时间=(音乐长度/44100)*1000;//跟踪持续时间(毫秒)
//在后台线程中启动冗长的操作
新线程(newrunnable()){
公开募捐{
//Log.i(“music length=,trackDuration+”);
同时(mProgressStatus<音乐长度){
mProgressStatus=音轨写入(音乐,0,音乐长度);
//更新进度条
mHandler.post(新Runnable(){
公开募捐{
音轨播放();
mProgress.setProgress(mProgressStatus);
}
});
Message msg=Message.get();