在专用线程中运行方法OnCallback

时间:2016-10-25 14:07:12

标签: android multithreading

TLDR; 运行一个方法,从每隔几毫秒更新一次的OnCallBack函数更新专用线程上的UI !!

我正在使用Vitamio库获取直播视频并在SurfaceView上显示这是由图书馆的MediaPlayer完成的。

但是,我需要将屏幕拆分为VR体验。如果MediaPlayer有方法在2 SurfaceView s上显示视频,那么我就不会遇到这样的问题。不幸的是,它没有。

因此,我认为直播视频会在屏幕上半部分的SurfaceView上运行,并且我会将每个帧图像Bitmap显示为占据下半部分的ImageView屏幕。

这是有效但不好......问题是复制图像太多了,这就是ImageView滞后的原因。

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <SurfaceView
        android:id="@+id/surfaceview_livestream"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_marginBottom="@dimen/activity_vertical_margin"
        android:layout_marginTop="@dimen/activity_vertical_margin"
        android:layout_weight="1" />
    <ImageView
        android:id="@+id/imageview_livestream"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_marginBottom="@dimen/activity_vertical_margin"
        android:layout_marginTop="@dimen/activity_vertical_margin"
        android:layout_weight="1"
        android:contentDescription="@string/live_stream" />
</LinearLayout>


public class LiveStreamManager implements MediaPlayer.OnBufferingUpdate {
   // some irrelevant code
   public void initLiveStream() {
      io.vov.vitamio.MediaPlayer mediaPlayer = new io.vov.vitamio.MediaPlayer();
      mediaPlayer.setDisplay(mainActivity.getSurfaceView());
      // other irrelevant code...
   }

   @Override
   public void onBufferingUpdate(MediaPlayer mp, int percent) {
       Bitmap frame = mp.getCurrentFrame();
       if (frame != null) { 
          mainActivity.setFrame(frame);
       }
    }
} 


public MainActivity extends Activity {
     // some code...

     // I want this to run on a dedicated thread
     public void setFrame(Bitmap frame) {
         imageviewLiveStream.setImageBitmap(frame);
     }
}

1 个答案:

答案 0 :(得分:0)

尝试使用rxJava:

Observable.interval(100, TimeUnit.MILLISECONDS)
                .observeOn(AndroidSchedulers.handlerThread())
                .map(t -> {
                    // do rendering here (on single render thread
                    return 'rendered images'
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe( t -> {
                    // set bitmaps here
                });

渲染将是每10毫秒在单独的线程(预先创建调度程序)上的一个,然后将在主线程上处理结果。