2013-06-22 35 views
5

Tôi đang cố cập nhật trình phát nhạc SeekBar đang hoạt động nhưng không có gì xảy ra. Các dịch vụ bắt đầu ok trong hoạt động của tôi và ràng buộc chính xác (vì tôi có thể sử dụng một số phương pháp trong dịch vụ của tôi và chơi nhạc tốt). Đây là mã dịch vụ của tôi:Cập nhật MusicPlayer SeekBar trong Dịch vụ

public class MusicPlayerService extends Service { 

MediaPlayer myMusicPlayer; 
String path; 
Intent getMusicId = new Intent(); 

// Binder given to clients 
private final IBinder mBinder = new LocalBinder(); 

/** 
* Class used for the client Binder. Because we know this service always 
* runs in the same process as its clients, we don't need to deal with IPC. 
*/ 
public class LocalBinder extends Binder { 
    MusicPlayerService getService() { 
     // Return this instance of LocalService so clients can call public methods 
     return MusicPlayerService.this; 
    } 
} 


@Override 
public void onCreate() { 
    // TODO Auto-generated method stub 
    myMusicPlayer = new MediaPlayer(); 
    Log.d(getClass().getSimpleName(),"onCreate()"); 
    super.onCreate(); 
} 

@Override 
public void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    // TODO Auto-generated method stub 

    Log.d(getClass().getSimpleName(), "onStartCommand()"); 

    return super.onStartCommand(intent, flags, startId); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    path = intent.getStringExtra("musicID"); 

    Log.e("Music path on SD received from intent", path); 

    try { 
     myMusicPlayer.setDataSource(path); 
     myMusicPlayer.setLooping(true); 
     myMusicPlayer.prepare(); 
    } catch (IllegalArgumentException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    myMusicPlayer.start(); 

    Log.d(getClass().getSimpleName(), "onBind()"); 

    return mBinder; 
} 

/** method for clients */ 
public int getMusicDuration() { 
    return myMusicPlayer.getDuration(); 
} 

public int getMusicCurPos(){ 
    return myMusicPlayer.getCurrentPosition(); 
} 

public void pauseMusic(){ 
    myMusicPlayer.pause(); 
    Log.d(getClass().getSimpleName(), "pauseMusic()"); 
} 

public void playMusic(){ 
    myMusicPlayer.start(); 
    Log.d(getClass().getSimpleName(), "start()"); 
} 
public void stopMusic(){ 
    myMusicPlayer.stop(); 
    Log.d(getClass().getSimpleName(), "stop()"); 
} 
public void seekToPos (int pos){ 
    myMusicPlayer.seekTo(pos); 
} 

} 

phần Thú vị là, sau khi liên kết các dịch vụ cho hoạt động của tôi và chạy nó một số phương pháp của dịch vụ trở về giá trị null như getDuration() và một số trong số họ làm việc thấy như onStart()onDestroy().

Xin cảm ơn trước.

Cập nhật:

Trong hoạt động của bạn, bạn phải kiểm tra xem dịch vụ ràng buộc bởi vì nó mất một thời gian để làm, sau đó sử dụng phương pháp nào mà nó cung cấp như:

//Bound Music service and pass the music path 
    Intent musicIntent = new Intent(this, MusicPlayerService.class); 
    musicIntent.putExtra("musicID", path); //Put Extra data for music player to play the exact file 
    bindService(musicIntent, mConnection, Context.BIND_AUTO_CREATE); //Bound the Music player service 

    //Music Handler for methods 
    musicMethodsHandler = new Handler(); 
    musicRun = new Runnable() { 

     @Override 
     public void run() { 
      if (mBound == true){ // Check if service bounded 
       if (musicTotTime == null){ // Put data in it one time 
        musicTotTime = myMusicPlayer.getMusicDuration(); 
        Log.v("Music Duration of Player in thread", musicTotTime.toString()); 
        seekBar.setMax(musicTotTime); 
       } 
       musicCurTime = myMusicPlayer.getMusicCurPos(); 
       Log.v("Music Duration of Player in thread", musicCurTime.toString()); 
       seekBar.setProgress(musicCurTime); 
      }else if(mBound == false){ // if service is not bounded log it 
       Log.v("Still waiting to bound", Boolean.toString(mBound)); 
      } 
      musicMethodsHandler.postDelayed(this, 1000); 
     } 
    }; 
    musicMethodsHandler.postDelayed(musicRun, 1000); 


/** Defines callbacks for service binding, passed to bindService() */ 
private ServiceConnection mConnection = new ServiceConnection() { 

    @Override 
    public void onServiceConnected(ComponentName className, 
      IBinder service) { 
     // We've bound to LocalService, cast the IBinder and get LocalService instance 
     LocalBinder binder = (LocalBinder) service; 
     myMusicPlayer = binder.getService(); 
     mBound = true; 

    } 

    @Override 
    public void onServiceDisconnected(ComponentName arg0) { 
     mBound = false; 
    } 
}; 

và giữ lưu ý rằng phương thức dịch vụ onCreate() chạy đầu tiên và một lần.

Trả lời

3

Bạn không nên cập nhật giao diện người dùng trực tiếp từ lớp Service của bạn, đây không phải là trách nhiệm của nó.

Trong số Activity bạn có thể chạy CountDownTimer hoặc tương tự như định kỳ thăm dò ý kiến ​​Service để xử lý các bản cập nhật SeekBar.

Nếu bạn cần gửi tin nhắn từ dịch vụ của bạn để hoạt động của bạn (chẳng hạn như khi theo dõi xong, vv), bạn có thể sử dụng một LocalBroadcastManager

Một số ví dụ:

+0

Cảm ơn bạn đã trả lời Ken Wolf, nhưng tại sao tôi không thể nhận được thời lượng trình phát nhạc bằng cách gọi phương thức dịch vụ? – Sozi

+0

Bạn nói nó trả về null nhưng bạn có nghĩa là nó trả về 0? –

+0

Trong hoạt động của tôi sau khi ràng buộc và bắt đầu dịch vụ khi cố gắng lấy dữ liệu từ dịch vụ như 'Integer duration = myMediaPlayer.getDuration();' (myMediaPlayer là một đối tượng của lớp dịch vụ của tôi) nó ném một "NullPointerException". – Sozi

Các vấn đề liên quan