2

我做了一个流媒体播放器,它运行在一个单独的服务而不是MainActivity上。当用户查询进度时更新SeekBar位置 我正在使用广播接收器来告诉服务有关用户所寻找的位置。之后服务提取查找位置,并且 更新MainActivity中SeekBar的当前位置。Android更新MediaPlayer SeekBar从服务类别的位置

一切正常,但当用户快速移动SeekBar时,服务类别 冻结了MainActivity的UI,并且一些时间崩溃。从Service类更新MainActivity的SeekBar的最佳方法是什么?

代码样本,

MainActivity,

// Set up constant ID for broadcast of seekbar position 
     public static final String BROADCAST_SEEKBAR = "com.gm.sendseekbar"; 
     private Intent intent; 

     @Override 
      public void onProgressChanged(SeekBar sb, int progress, boolean fromUser) { 
       // TODO Auto-generated method stub 
       if (fromUser) { 
        int seekPos = sb.getProgress(); 
        intent.putExtra("seekpos", seekPos); 
        sendBroadcast(intent); 
       } 
      } 

服务类

@Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     mp = new MediaPlayer(); 
     mp.setOnBufferingUpdateListener(this); 
     mp.setOnCompletionListener(this); 
     mp.setOnInfoListener(this); 
     mp.setOnPreparedListener(this); 
     mp.setOnSeekCompleteListener(this); 
     mp.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); 
     } 

@Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 

     // Set up receiver for seekbar change 
     registerReceiver(broadcastReceiver, new IntentFilter(
       ActivityMain.BROADCAST_SEEKBAR)); 

} 

// Receive seekbar position if it has been changed by the user in the main activity 
    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      sendBufferStartBroadcast(); 
      updateSeekPos(intent); 
     } 
    }; 

    // Update seek position from Activity 
    public void updateSeekPos(Intent intent) { 

     int seekPos = intent.getIntExtra("seekpos", 0); 
     if (mp.isPlaying()) { 

      int playPositionInMillisecconds = (mediaFileLengthInMilliseconds/100) 
        * seekPos; 
      mp.seekTo(playPositionInMillisecconds); 

     } 

    } 

回答