Hey there, 

I hope everyone’s week is off to a good start! 

I have a pretty simple use case: I am playing video streamed across the network 
in an app, and I need to update two SeekBars every second, one which tracks the 
video’s timecode while playing, and the other which tracks the device volume. 
Simple enough, gun up a background thread, and update both every second (given 
that to my knowledge, I can’t have the system call a listener specific to 
either of those functions. In a nutshell, the video streams just fine when this 
control-updating thread isn’t running, but when it is running, the video is so 
chunky and slow, and audio garbled, that it isn’t watchable. 

First, the video display is accomplished using a TextureView in combination 
with a MediaPlayer (the reason is that the TextureView allows scrolling / 
movement, SurfaceView does not). Second, I have tried a couple of different 
approaches for the background thread: 

a) I have tried a Runnable in a new Thread which updates the SeekBar controls 
inside of a runOnUIThread — this keeps a looping background thread and updates 
the controls on the UI thread, as such: 

new Thread(new ManagementRunnable()).start();
...
public class ManagementRunnable implements Runnable
 {
        public void run()
        {
            try
            {
                updateControlState();
                Thread.sleep(1000);
            }
            catch (Exception ex)
            {
                ex.printStackTrace();
            }
        }
 }
...
public void updateControlState()
{
       runOnUiThread(new Runnable()
       {
            public void run()
            {
                // update the timecode SeekBar
                ...
                // update the volume SeekBar
                ...
            }
        }
}

b) I have also tried using a Handler, where it runs on the UI thread, as such: 

new Handler().post(new ManagementRunnable());
...
public class ManagementRunnable implements Runnable
 {
        public void run()
        {
            try
            {
                updateControlState();
                handler.postDelayed(this, 1000);
            }
            catch (Exception ex)
            {
                ex.printStackTrace();
            }
        }
 }

public void updateControlState()
{
        // update the timecode SeekBar
        ...
        // update the volume SeekBar
        ...
}

The problem is, the result is the same regardless of which approach is taken — 
the video is unwatchable. I have tested this on a Samsung Galaxy S2 Skyrocket, 
and in the simulator. I’ve Googled this a fair amount, and it appears that the 
approaches above are generally the recommended approach. While video decoding 
and playing isn’t exactly a cheap operation, I’m a little surprised that 
accommodating a once-per-second update brought the app to its knees, given 
nothing else taking place in the app.

If anyone has any insight, I would really appreciate it. 

Thanks, 

Brad 

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to