Переменная цикла не обновляется внутри цикла

У меня есть приложение для потоковой передачи аудио, и когда я попытался реализовать поток, я получил эту ошибку «Переменная цикла не обновлена ​​внутри цикла» Как я могу обновить цикл.

это сообщение отладки

E / MediaPlayerNative: попытка выполнить seekTo в неправильном состоянии: mPlayer = 0xa1577660, mCurrentState = 0 ошибка (-38, 0) Попытка вызвать getDuration в неправильном состоянии: mPlayer = 0xa1577660, mCurrentState = 0 ошибка (-38, 0)

и вот мой код

package com.excellentaccountant.mohammed.myapplication;

 import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {

Button playBt1;
SeekBar positionBar;
TextView elopsedtimeLable;
TextView remainingTimeLable;
MediaPlayer mp;
int totalTime;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



    playBt1 = (Button)findViewById(R.id.playButton);


    final String url = "URL"
    final MediaPlayer mp = new MediaPlayer();
    mp.setAudioStreamType(AudioManager.STREAM_MUSIC);



    try {



        playBt1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            if (!mp.isPlaying()){
                mp.start();
                playBt1.setBackgroundResource(R.drawable.pause);
            }

            else {

                mp.pause();
                playBt1.setBackgroundResource(R.drawable.play);
            }
            }
        });


        mp.setDataSource(url);
    } catch (IOException e) {
        e.printStackTrace();
    }
    mp.prepareAsync(); // might take long! (for buffering, etc)
    mp.start();



    positionBar = (SeekBar)findViewById(R.id.positionBar);
    positionBar.setMax(totalTime);
    positionBar.setOnSeekBarChangeListener(
            new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (fromUser){

                    mp.seekTo(progress);
                    positionBar.setProgress(progress);

                }
                }

                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {

                }

                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {

                }
            }
    );

new Thread(new Runnable() {


@Override
public void run() {

    while (mp != null){




        try {

            Message msg = new Message();
            msg.what = mp.getCurrentPosition();
            handler.sendMessage(msg);



            Thread.sleep(1000);
        }catch (InterruptedException e){}

    }
}
}).start();


}
private Handler handler = new Handler (){

    @Override
    public void handleMessage(Message msg) {
        int currentPosition = msg.what;
        positionBar.setProgress(currentPosition);

        String elopsedTime = createTimeLable (currentPosition);
        elopsedtimeLable.setText(elopsedTime);

        String remainingtime = createTimeLable(totalTime-currentPosition);
        remainingTimeLable.setText("- " + remainingtime);

    }
};


public String createTimeLable (int time){

    String timelable = "";
    int min = time /1000/60;
    int sec = time /1000 % 60;

    timelable = min + ":";
    if (sec < 10)timelable += "0";
    timelable += sec;
       return timelable;



    }



}

Почему вы устанавливаете positionBar.setProgress(progress); внутри onProgressChanged(), если он уже имеет значение progress?

forpas 23.12.2018 13:26

@forpas на самом деле я реализовал эти коды из онлайн-руководства, и он работал со мной, когда я воспроизводил аудиофайлы из необработанной папки. Теперь я хочу транслировать с внешнего URL-адреса. Не могли бы вы помочь мне и сказать, что делать, потому что я не профессиональный программист. Спасибо

mohammed refat 23.12.2018 14:56

попробуйте добавить setOnPreparedListener () в свой медиаплеер и запустить медиаплеер из его метода onPrepared. ошибка (-38) обычно означает, что вы используете такие методы, как play () start () и т. д., на неподготовленном медиаплеере.

Sahdeep Singh 23.12.2018 16:24

@Sahdeep Singh Я думаю, проблема в Thread. потому что все работало до того, как я добавил поток и обработчик. как только я реализовал поток и обработчик для синхронизации панели поиска с медиаплеером, приложение вылетело и показало эту ошибку

mohammed refat 23.12.2018 16:37

Возможно, проблема связана с потоком, я также реализовал это в своем приложении, вы можете получить от него ссылку github.com/iamSahdeep/Bop/blob/master/app/src/main/java/com/‌…

Sahdeep Singh 23.12.2018 16:43
0
5
458
0

Другие вопросы по теме