2012-02-06 2 views
1

내 mediaplayer가 작동하는 서비스 클래스가 있습니다. 내 서비스가 mediaplayer를 만들 때 내 mediaplayer가 자체 작성을 마칠 때까지 잠깐 멈추거나 멈춤처럼 일시 중지됩니다. 내가 원하는 것은 재생 버튼을 누르면 토스트 메시지가 나타나고 "연결 중"이라는 메시지가 표시되고 mediaplayer가 준비되면 토스트 메시지에 "연결됨"이라고 표시되고 mediaplayer가 어떻게 든 음악을 재생하기 시작합니다. 내 토스트가 표시되지 않고 을 heres 내 서비스 코드의 말을 ..mediaplayer 및 service class

을 :

public class myservice extends Service { 

MediaPlayer player; 
private Handler UIHandler = new Handler(); 
private Uri source = Uri.parse("http://www.mydomain.com:8000/listen.mp3"); 

@Override 
public IBinder onBind(Intent arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 

public void onCreate() { 
    Toast.makeText(this, "Connecting", Toast.LENGTH_SHORT).show(); 
      player = MediaPlayer.create(this, source); 
} 

private void testtoast() { 
    Toast.makeText(this, "Connecting", Toast.LENGTH_SHORT).show(); 
} 

public void onStart(Intent intent, int StartId) { 
    Toast.makeText(this, "Connected", Toast.LENGTH_SHORT).show(); 
    player.setOnPreparedListener(new OnPreparedListener() { 
     public void onPrepared(MediaPlayer player) { 
      // TODO Auto-generated method stub 
      player.start(); 
     } 
    }); 
} 

public void onDestroy() { 
    Toast.makeText(this, "Destroyed", Toast.LENGTH_SHORT).show(); 
    player.stop(); 
    player.release(); 
} 
    } 
+0

필자는 개인적으로'MediaPlayer' 클래스를 사용한 적이 없으므로 사용법이나'.create()'했을 때 어떻게 동작하는지 모릅니다. 그러나 '서비스'는 자체 스레드 또는 프로세스 내에서 UI 스레드 내에서 실행된다는 점을 지적 할 가치가 있다고 생각했습니다. 즉,'onCreate()'와 같이'Service' 내에서 수행하는 시간 소모적 인 작업은 사용자 인터페이스의 응답성에 영향을 주며 조심하지 않으면 ANR이 발생할 수도 있습니다. 따라서 '서비스'내에서 시간이 많이 걸리거나 프로세스 집약적 인 작업을하려면 별도의 '스레드'에서 수행해야합니다. – Trevor

+0

그 trevor를 가리키는 주셔서 감사합니다 어떻게 할 수있는 샘플을 가지고 .. 안드로이드에서 메신저 정말 멍청한 놈. – HeartlessArchangel

답변

0

 player = new MediaPlayer(); 
     player.setDataSource(source); 
     player.prepareAsync(); 
012로

 player = MediaPlayer.create(this, source); 

교체

MediaPlayer.createprepare()은 동기 동작 인 MediaPlayer를 준비하는 메서드를 호출하고 UI가 지연되므로 UI가 지연 될 수 있습니다. 따라서 위의 예제에서 제공된 것처럼 지연을 피하려면 명시 적으로 .prepareAsync()을 사용해야합니다.