2012-03-09 9 views
2

を引き起こし続ける私はストリーミングが罰金起こるが、AsyncTaskのAndroidメディアプレーヤーがANR

* サンプルを使用していていてもUIスレッドで発生するようですメディアプレーヤーを使用してオーディオをストリーミングすることになっているサービスがありますコード*

package com.package.app; 


import android.app.Service; 
import android.content.Intent; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnPreparedListener; 
import android.os.AsyncTask; 

import android.os.IBinder; 
import android.util.Log; 
import android.widget.Toast; 

public class Mplayer extends Service { 
    static boolean isPlaying = false; 
    public MediaPlayer mp; 
    String url = null; 

    public IBinder onBind(Intent paramIntent) { 
     return null; 
    } 

    public void onCreate() { 
     super.onCreate(); 
     isPlaying = false; 
    } 

    public void onDestroy() { 
     super.onDestroy(); 
     Toast.makeText(getApplicationContext(), "Music stopping", 1).show(); 

     mp.stop(); 
     mp.release(); 
     isPlaying = false; 
    } 

    public void onStart(Intent paramIntent, int paramInt) { 
     super.onStart(paramIntent, paramInt); 
     Toast.makeText(getApplicationContext(), "Getting the Best", 1).show(); 
     url = ((String) paramIntent.getExtras().getString("url")); 

     play p = new play(); 
     p.execute(); 


    } 


    public class play extends AsyncTask<Void, Integer, Void> { 

     @Override 
     protected void onPreExecute() { 
      // TODO Auto-generated method stub 
      super.onPreExecute(); 
      mp = new MediaPlayer(); 
      mp.setAudioStreamType(3); 
      Log.v("service", "starting jobo"); 


     } 

     @Override 
     protected Void doInBackground(Void... params) { 

      try { 
       Log.v("service", url); 
       mp.setDataSource(url); 
       Log.v("service", "datasourse set"); 
       mp.prepareAsync(); 

       Log.v("service", "prepared"); 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       Log.v("serviceError", e.toString()); 

      } 

      mp.setOnPreparedListener(new OnPreparedListener() { 

       @Override 
       public void onPrepared(MediaPlayer player) { 

        Log.v("service","going in "); 
        player.getDuration(); 
        player.start(); 
        Log.v("duration", player.getDuration()+" "); 
        for(int i=0; i<player.getDuration(); player.getCurrentPosition()) 
        { 
         //Log.v("position", "pos"+player.getCurrentPosition()); 
        } 


        Log.v("service", "playing"); 

       } 
      }); 

      return null; 
     } 

     @Override 
     protected void onProgressUpdate(Integer... values) { 
      // TODO Auto-generated method stub 
      //super.onProgressUpdate(values); 
      int n = values[0]; 
      Toast.makeText(getApplicationContext(), n+" time ", Toast.LENGTH_LONG).show(); 
     } 


    } 
} 

このコードはANRエラーが発生し

+0

は、それが必要ではないが、そのためにAsynctaskを使用しないでください。 MediaPlayerには準備ができたらコールバックを返すprepareAsyncメソッドがあります。既に使用していますが、MediaPlayerが独自のスレッドを処理していることを忘れないでください。 (ただし、サービスはUIと共にメインスレッド上で実行されます)。 –

答えて

-1
 Use Intent Service in place of Service which execute run your media file in seperate thread. 
`public class BackgroundService extends IntentService { 
    public BackgroundService() { 


      super("BackgroundService"); 
     } 
    @Override 
     protected void onHandleIntent(Intent intent) { 
      // TODO Auto-generated method stub 
    //put all your media player code in this method 
    } 

    }` 
+0

悪いアドバイス。インテントサービスを使用しないでください。このタスクにはサービスを使用することをおすすめします(メディア再生)。 Googleのドキュメントをご覧ください:http://developer.android.com/training/managing-audio/index.html –

関連する問題