2012-02-06 8 views
1

私のサービスが動作するサービスクラスがあります。私の唯一の問題は、自分のサービスがmediaplayerを作成するときに、ハングしたようなUIを一時停止します。私は再生ボタンを押すと、トーストメッセージが表示され、「接続中」と表示され、メディアプレーヤーが準備されていることを示すトーストメッセージが表示され、「接続済み」と表示された場合、メディアプレイヤーは、その後半..mediaplayerとservice class

HERESに私のサービスコードを実行します。

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'内で時間のかかる作業を行うと、UIの応答性に影響を与え、注意を払わないとANRが発生することを意味します。したがって、あなたが 'サービス '内で行う時間のかかる作業やプロセス集約的な作業は、依然として別の'スレッド 'で実行されるべきです。 – Trevor

+0

トレバーを指摘してくれてありがとう、私はそれを行うことができる方法についてのサンプルを持っていますか?本当にアンドロイドのnoob – HeartlessArchangel

答えて

0

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

 player = MediaPlayer.create(this, source); 

を交換してください

MediaPlayer.createprepare()を呼び出すと、同期操作であるMediaPlayerを作成し、UIがハングしてUIが遅れることがあります。したがって、上記の例に示すように、この遅延を避けるには、.prepareAsync()を明示的に使用する必要があります。