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); 

     } 

    } 

回答