Your code has... issues.

1. You do need to not manually import com.musix.main.R -- it is
automatically imported since your class resides in the same package as
R.

2. Do not fork a thread to update a progress indicator. Use
postDelayed() (available on any View) to schedule a Runnable that
updates the progress and calls postDelayed() again on itself.

3. Do not put a MediaPlayer in a static data member, as you appear to
have done with LocalMediaPlayer. Static data members should be avoided
where possible, and I fail to see why this case would be necessary.

4. Do not update the UI from a background thread, as this is the
source of your exception, when you call setTotalSongDuaration() from
your background thread. If you do #2 above, this problem will go away.

5. onClick() will always be called on the main application thread, so
you do not need runOnUiThread() there.

On Sat, Jun 4, 2011 at 6:54 PM, Hitendrasinh Gohil
<[email protected]> wrote:
> Here is my playerview class.when the song first time played total song
> duration is set and seekbar runs,but when i do next the total song
> duration is of firstsong and it gives exception.
>
> package com.musix.main;
>
> import com.musix.main.R;
> import android.app.Activity;
> import android.os.Bundle;
> import android.util.Log;
> import android.view.View;
> import android.view.View.OnClickListener;
> import android.view.Window;
> import android.widget.ImageButton;
> import android.widget.SeekBar;
> import android.widget.TextView;
>
> public class LocalPlayerView extends Activity implements
> OnClickListener {
>        private ImageButton btnnext, btnplay, btnprevious;
>        LocalMediaPlayer mediaplayer;
>        public static boolean drag = false, CHANGE;
>        SeekBar sbCurrentSong;
>        public static int mprogress;
>        private int minutes, seconds, total;
>        private TextView tvSongTotalTime, tvSongCurrentTime, txtsongname,
>                        txtalbumartistname;
>
>        public void onCreate(Bundle instance) {
>                super.onCreate(instance);
>                requestWindowFeature(Window.FEATURE_NO_TITLE);
>                setContentView(R.layout.localplayerview);
>                mediaplayer = new LocalMediaPlayer(getApplicationContext());
>                loadUI();
>        }
>
>        private void loadUI() {
>                try {
>                        btnnext = (ImageButton) findViewById(R.id.next);
>                        btnnext.setOnClickListener(this);
>                        btnplay = (ImageButton) findViewById(R.id.play);
>                        btnplay.setOnClickListener(this);
>                        btnprevious = (ImageButton) 
> findViewById(R.id.previous);
>                        btnprevious.setOnClickListener(this);
>                        txtsongname = (TextView) 
> findViewById(R.id.txtsongname);
>                        txtalbumartistname = (TextView)
> findViewById(R.id.txtalbumartistname);
>                        tvSongTotalTime = (TextView) 
> findViewById(R.id.tvSongTotalTime);
>                        tvSongCurrentTime = (TextView)
> findViewById(R.id.tvSongCurrentTime);
>                        setSongDetails();
>                        startProgress();
>                        sbCurrentSong = (SeekBar) 
> findViewById(R.id.sbCurrentSong);
>                        sbCurrentSong
>                                        .setOnSeekBarChangeListener(new 
> SeekBar.OnSeekBarChangeListener()
> {
>                                                @Override
>                                                public void 
> onProgressChanged(SeekBar seekBar,
>                                                                int progress, 
> boolean fromUser) {
>                                                        String seconds;
>                                                        String str = new 
> String();
>                                                        mprogress = progress;
>                                                        if (fromUser)
>                                                                
> LocalMediaPlayer.mediaplayer.seekTo(progress);
>
>                                                        
> sbCurrentSong.setProgress(progress);
>
>                                                        seconds = Integer
>                                                                        
> .toString(((progress / 1000) % 60));
>
>                                                        // Here if condition 
> check the second string length
>                                                        // if length
>                                                        // is equal to 1 then 
> we add 0 infront of that
>                                                        // string.
>
>                                                        if (seconds.length() 
> == 1)
>                                                                str = 
> str.concat("0" + seconds);
>                                                        else
>                                                                str = seconds;
>                                                        int ctime = ((progress 
> / 1000) / 60);
>
>                                                        // Here if condition 
> check the current time if it
>                                                        // is less than 9 then 
> we will add 0 infront of it
>
>                                                        if (ctime > 9) {
>                                                                
> tvSongCurrentTime.setText(Integer
>                                                                               
>  .toString(ctime) + ":" + str);
>                                                        } else {
>                                                                
> tvSongCurrentTime.setText("0"
>                                                                               
>  + Integer.toString(ctime) + ":" + str);
>                                                        }
>                                                }
>
>                                                @Override
>                                                public void 
> onStartTrackingTouch(SeekBar seekBar) {
>                                                        // TODO Auto-generated 
> method stub
>                                                }
>
>                                                @Override
>                                                public void 
> onStopTrackingTouch(SeekBar seekBar) { // TODO
>                                                                               
>                                                                          // 
> Auto-generated
>                                                                               
>                                                                          // 
> method
>                                                                               
>                                                                          // 
> stub
>
>                                                }
>                                        });
>
>                } catch (Exception e) {
>                        e.printStackTrace();
>                }
>
>        }
>
>        @Override
>        public void onClick(View v) {
>                switch (v.getId()) {
>                case R.id.play:
>                        if (LocalMediaPlayer.mediaplayer.isPlaying()) {
>                                LocalMediaPlayer.mediaplayer.pause();
>                                
> btnplay.setBackgroundResource(R.drawable.play_button);
>                                LocalMediaPlayer.isPaused = true;
>                        } else {
>                                
> btnplay.setBackgroundResource(R.drawable.pause_button);
>                                mediaplayer.startPlayer();
>                        }
>
>                        break;
>                case R.id.next:
>                        btnplay.setBackgroundResource(R.drawable.pause_button);
>                        mediaplayer.next();
>                        runOnUiThread(new Runnable() {
>
>                                @Override
>                                public void run() {
>                                        setSongDetails();
>                                        //startProgress();
>                                }
>                        });
>
>                        break;
>                case R.id.previous:
>                        btnplay.setBackgroundResource(R.drawable.pause_button);
>                        mediaplayer.previous();
>                        runOnUiThread(new Runnable() {
>
>                                @Override
>                                public void run() {
>                                        setSongDetails();
>                                        //startProgress();
>                                }
>                        });
>                        break;
>
>                default:
>                        break;
>                }
>
>        }
>
>        public void startProgress() {
>                try {
>                        new Thread() {
>                                public void run() {
>                                        // mp is your MediaPlayer
>                                        // progress is your ProgressBar
>
>                                        int currentPosition = 0;
>                                        total = 
> LocalMediaPlayer.mediaplayer.getDuration();
>                                        sbCurrentSong.setMax(total);
>                                        setTotalSongDuaration();
>                                        while (LocalMediaPlayer.mediaplayer != 
> null
>                                                        && currentPosition < 
> total) {
>                                                try {
>                                                        Thread.sleep(1000);
>                                                        currentPosition = 
> LocalMediaPlayer.mediaplayer
>                                                                        
> .getCurrentPosition();
>                                                } catch (InterruptedException 
> e) {
>                                                        return;
>                                                } catch (Exception e) {
>                                                        return;
>                                                }
>                                                
> sbCurrentSong.setProgress(currentPosition);
>                                        }
>                                }
>
>                        }.start();
>                } catch (Exception e) {
>                        e.printStackTrace();
>                }
>        }
>        public void setSongDetails() {
>                try {
>                        txtsongname.setText(LocalTrack.LOCALTRACKLIST
>                                        .get(LocalMediaPlayer.CURRENTINDEX));
>                        txtalbumartistname.setText(LocalTrack.LOCALALBUMLIST
>                                        .get(LocalMediaPlayer.CURRENTINDEX)
>                                        + "-"
>                                        + LocalTrack.LOCALARTISTLIST
>                                                        
> .get(LocalMediaPlayer.CURRENTINDEX));
>                } catch (Exception e) {
>                        e.printStackTrace();
>                }
>        }
>
>        public void setTotalSongDuaration() {
>                minutes = (int) ((total / 1000) / 60);
>                seconds = (int) ((total / 1000) % 60);
>
>                // Here if condition check minute is less than 10 then it will 
> check
> for
>                // seconds.
>
>                if (minutes < 10) {
>                        // Here if condition check if second is less than 9 
> then it will
> add
>                        // 0 infront
>                        // of seconds.
>
>                        if (seconds <= 9)
>                                tvSongTotalTime.setText("0" + 
> Integer.toString(minutes) + ":"
>                                                + "0" + 
> Integer.toString(seconds));
>                        else
>                                tvSongTotalTime.setText("0" + 
> Integer.toString(minutes) + ":"
>                                                + Integer.toString(seconds));
>                } else {
>
>                        // Here if condition check if second is less than 9 
> then it will
> add
>                        // 0 infront
>                        // of seconds.
>
>                        if (seconds <= 9)
>                                
> tvSongTotalTime.setText(Integer.toString(minutes) + ":" + "0"
>                                                + Integer.toString(seconds));
>                        else
>                                
> tvSongTotalTime.setText(Integer.toString(minutes) + ":"
>                                                + Integer.toString(seconds));
>                }
>
>                tvSongTotalTime.refreshDrawableState();
>        }
>
> }
>
> Here is the error log.
> W/dalvikvm(  341): threadid=8: thread exiting with uncaught exception
> (group=0x4001d800)
> E/AndroidRuntime(  341): FATAL EXCEPTION: Thread-11
> E/AndroidRuntime(  341): android.view.ViewRoot
> $CalledFromWrongThreadException: Only the original thread that created
> a view hierarchy can touch its views.
> E/AndroidRuntime(  341):        at
> android.view.ViewRoot.checkThread(ViewRoot.java:2802)
> E/AndroidRuntime(  341):        at
> android.view.ViewRoot.requestLayout(ViewRoot.java:594)
> E/AndroidRuntime(  341):        at
> android.view.View.requestLayout(View.java:8125)
> E/AndroidRuntime(  341):        at
> android.view.View.requestLayout(View.java:8125)
> E/AndroidRuntime(  341):        at
> android.view.View.requestLayout(View.java:8125)
> E/AndroidRuntime(  341):        at
> android.view.View.requestLayout(View.java:8125)
> E/AndroidRuntime(  341):        at
> android.view.View.requestLayout(View.java:8125)
> E/AndroidRuntime(  341):        at
> android.widget.TextView.checkForRelayout(TextView.java:5378)
> E/AndroidRuntime(  341):        at
> android.widget.TextView.setText(TextView.java:2688)
> E/AndroidRuntime(  341):        at
> android.widget.TextView.setText(TextView.java:2556)
> E/AndroidRuntime(  341):        at
> android.widget.TextView.setText(TextView.java:2531)
> E/AndroidRuntime(  341):        at
> com.musix.main.LocalPlayerView.setTotalSongDuaration(LocalPlayerView.java:
> 213)
> E/AndroidRuntime(  341):        at com.musix.main.LocalPlayerView
> $4.run(LocalPlayerView.java:162)
>
> can anybody can be how can i solve out this problem?
>
> --
> You received this message because you are subscribed to the Google
> Groups "Android Developers" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> [email protected]
> For more options, visit this group at
> http://groups.google.com/group/android-developers?hl=en
>



-- 
Mark Murphy (a Commons Guy)
http://commonsware.com | http://github.com/commonsguy
http://commonsware.com/blog | http://twitter.com/commonsguy

_The Busy Coder's Guide to Android Development_ Version 3.6 Available!

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to