اشکال در multi threading (حل شد , مشکل در جاوا - همزمانی نبود)
سلام دوستان
این کد یه پلیر داخل اکتیویتی هستش که منتها بخاطر مشکل تو ترد هاش اهنگ هنگام پخش تیک میزنه
seekber با فاصله 1000 میلی ثانیه اپدیت میشه و تو همین زمان mediaplayer تیک میزنه
img_play.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub if (G.mediaPlayer != null) { if (G.mediaPlayer.isPlaying()) { G.log("G.mediaPlayer.isPlaying()"); img_play.setImageResource(R.drawable.play_button); G.log("img_play.setImageResource(R.drawable.play_button);"); G.mediaPlayer.pause(); G.log("G.mediaPlayer.pause();"); } else { G.log(" else !G.mediaPlayer.isPlaying()"); img_play.setImageResource(R.drawable.pause_button); G.log("img_play.setImageResource(R.drawable.pause_button);"); startMediaPlayer(); G.log("G.mediaPlayer.startMediaPlayer();"); handler.post(runnable); G.log("updateSeekbar();"); } } else { createNewMediaPlayer(pathSong); } } });
.
.
.
private void startMediaPlayer() { // TODO Auto-generated method stub seekbar_play.setMax(G.mediaPlayer.getDuration()); setImgPause(); G.mediaPlayer.start(); }
.
.
.
Runnable runnable = new Runnable() { @Override public void run() { // TODO Auto-generated method stub if (G.mediaPlayer != null) { if ( !G.mediaPlayer.isPlaying()) return; G.log("handler post"); int mCurrentPosition = G.mediaPlayer.getCurrentPosition(); seekbar_play.setProgress(mCurrentPosition); int finalTime = G.mediaPlayer.getDuration(); int startTime = G.mediaPlayer.getCurrentPosition(); txt_time_duration.setText(String.format("%02d:%02d", TimeUnit.MILLISECONDS.toMinutes((long) finalTime), TimeUnit.MILLISECONDS.toSeconds((long) finalTime) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) finalTime))) ); txt_time_now.setText(String.format("%02d:%02d", TimeUnit.MILLISECONDS.toMinutes((long) startTime), TimeUnit.MILLISECONDS.toSeconds((long) startTime) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) startTime))) ); } handler.postDelayed(this, 1000); } };
سلام .
موضوع اول این که اصلا دیزاین پترن خوبی برای update کردن seekbar ننوشتین.
دوم این که از handler استفاده کردین دلیل بر این نمیشه که کدتون توی یک ترد به غیر از ترد main داره اجرا میشه. کدهای handler توی همون تردی اجرا میشن که handler اونجا تعریف شده باشه.
handler تون رو 100 درصد توی ترد main تعریف کردید پس کد ها در ترد main اجرا میشن و برنامه لگ داره.
طبق مستندات
public final boolean postDelayed (Runnable r, long delayMillis)
Causes the Runnable r to be added to the message queue, to be run after the specified amount of time elapses. The runnable will be run on the thread to which this handler is attached. The time-base is uptimeMillis(). Time spent in deep sleep will add an additional delay to execution.
کدهای داخل runnable که از طریق تابع postDelayed (Runnable r, long delayMillis) فراخوانی میشن روی همون تردی که handler بهش attach شده باشه اجرا میشن ... بالا توضیح دادم
یک ترد ایجاد کنید و داخل اون ترد ، ui رو آپدیت کنید (که شما همون seekbar رو آپدیت می کنید)
سلام ممنون ازین که وقت گذاشتین جواب دادین
اول اینکه دیزاین پترنم برا اپدیت کردن سیک بار چه مشکلی داره؟
من کدم رو به این شکل در اوردم . ببینید یه جای دیگه هم تو برنامم میخوام یه اهنگ دیگه رو با async task دانلود کنم ولی این پلیره متوقف میشه کلا متوجه نمیشم کدوم باید تو کدوم ترد اجرا بشه
private void updateSeekbar() { // TODO Auto-generated method stub seekbar_play.setMax(G.mediaPlayer.getDuration()); ActivityPlay.this.runOnUiThread(new Runnable() { @Override public void run() { if (G.mediaPlayer != null) { if ( !G.mediaPlayer.isPlaying()) return; int mCurrentPosition = G.mediaPlayer.getCurrentPosition(); seekbar_play.setProgress(mCurrentPosition); int finalTime = G.mediaPlayer.getDuration(); int startTime = G.mediaPlayer.getCurrentPosition(); txt_time_duration.setText(String.format("%02d:%02d", TimeUnit.MILLISECONDS.toMinutes((long) finalTime), TimeUnit.MILLISECONDS.toSeconds((long) finalTime) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) finalTime))) ); txt_time_now.setText(String.format("%02d:%02d", TimeUnit.MILLISECONDS.toMinutes((long) startTime), TimeUnit.MILLISECONDS.toSeconds((long) startTime) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) startTime))) ); } handler.postDelayed(this, 1000); } }); }
private void updateSeekbar() { // TODO Auto-generated method stub Thread thread = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub seekbar_play.setMax(G.mediaPlayer.getDuration()); while (true) { G.log("update"); if (G.mediaPlayer != null) { if ( !G.mediaPlayer.isPlaying()) return; int mCurrentPosition = G.mediaPlayer.getCurrentPosition(); seekbar_play.setProgress(mCurrentPosition); int finalTime = G.mediaPlayer.getDuration(); int startTime = G.mediaPlayer.getCurrentPosition(); /*txt_time_duration.setText(String.format("%02d:%02d", TimeUnit.MILLISECONDS.toMinutes((long) finalTime), TimeUnit.MILLISECONDS.toSeconds((long) finalTime) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) finalTime))) );*/ /*txt_time_now.setText(String.format("%02d:%02d", TimeUnit.MILLISECONDS.toMinutes((long) startTime), TimeUnit.MILLISECONDS.toSeconds((long) startTime) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) startTime))) );*/ } try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }); thread.start();
که ارور میده
دیگه واقعا دارم دیوونه میشم
یه خط کدو یه جا میزارم لگ میزنه برش میدارم یه جا دیگه میزارم لگ نمیزنه
کد startFull رو نگاه کنید
//startFull(pathSong); if (new File(pathSong).exists()) { G.log("if (new File(pathSong).exists()) "); orderButtonsPlay(); G.log("orderButtonsPlay();"); if (G.mediaPlayer != null) { G.log("if (G.mediaPlayer != null)"); int duration = MediaPlayer.create(G.context, Uri.parse(pathSong)).getDuration(); int last_duration = G.mediaPlayer.getDuration(); if (G.mediaPlayer.isPlaying()) { G.log("if (G.mediaPlayer.isPlaying())"); if (duration == last_duration) { G.log("if duration == last_duration"); //nothing setImgPause(); MainActivity.myHandler.postDelayed(UpdateSongTime, 1000); //updateSeekbar(); } else { G.log("else duration != last_duration"); G.mediaPlayer.stop(); G.log("G.mediaPlayer.stop();"); G.mediaPlayer.reset(); G.log("G.mediaPlayer.reset();"); createNewMediaPlayer(pathSong); G.log("createNewMediaPlayer();"); startMediaPlayer(); G.log("startMediaPlayer();"); MainActivity.myHandler.postDelayed(UpdateSongTime, 1000); //updateSeekbar(); G.log("updateSeekbar();"); } } else { G.log("else is playing"); if (duration == last_duration) { G.log("if duration == last_duration"); startMediaPlayer(); G.log("startMediaPlayer();"); MainActivity.myHandler.postDelayed(UpdateSongTime, 1000); //updateSeekbar(); G.log("updateSeekbar();"); } else { G.log("else duration != last_duration"); G.mediaPlayer.reset(); G.log("G.mediaPlayer.reset();"); createNewMediaPlayer(pathSong); G.log("createNewMediaPlayer();"); startMediaPlayer(); G.log("startMediaPlayer();"); MainActivity.myHandler.postDelayed(UpdateSongTime, 1000); //updateSeekbar(); G.log("updateSeekbar();"); } } } else { startFull(pathSong); G.log("else media== null"); /* createNewMediaPlayer(pathSong); G.log("createNewMediaPlayer();"); startMediaPlayer(); G.log("startMediaPlayer();"); MainActivity.myHandler.postDelayed(UpdateSongTime, 1000); //updateSeekbar(); G.log("updateSeekbar();");*/ } } else { G.log("else new file not exist"); orderButtonsDownload(); G.log("orderButtonsDownload();"); }
public void startFull(String pathSong) { G.mediaPlayer = MediaPlayer.create(G.context, Uri.parse(pathSong)); G.mediaPlayer.start(); seekbar_play.setMax(G.mediaPlayer.getDuration()); myHandler.postDelayed(UpdateSongTime, 100); }
private Runnable UpdateSongTime = new Runnable() { @Override public void run() { G.log("handler post"); int startTime = G.mediaPlayer.getCurrentPosition(); txt_time_now.setText(String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes((long) startTime), TimeUnit.MILLISECONDS.toSeconds((long) startTime) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS. toMinutes((long) startTime))) ); seekbar_play.setProgress((int) startTime); MainActivity.myHandler.postDelayed(this, 100); } };
خداروشکر
اقا واقعا توسل و دعای مادر تاثیر داره ها
به مادرم گفتم سه سوت نشد گرهم باز شد
مشکل ازین جا بود
دلیل لگ زدن نه ترد بود نه هندلر
این بود
seekbar_play.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar arg0) { // TODO Auto-generated method stub } @Override public void onStartTrackingTouch(SeekBar arg0) { // TODO Auto-generated method stub } @Override public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) { // TODO Auto-generated method stub >>>>> if (G.mediaPlayer != null) G.mediaPlayer.seekTo(arg1); } });
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .