Android 进度条不动

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

我有一个播放/录制样本的音频应用程序。我在UI上放了一个进度条,但是当播放样本时,进度条不会移动,或者似乎会随着样本的增加而增加。我如何让它移动

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();