2012-04-04 22 views
7

私は無線ストリームをストリーミングしています。ストリーム内の曲が変更されたときに通知を生成したいと思います。現在のストリームのメタデータを取得するのにstreamscraper(http://code.google.com/p/streamscraper)を使用しています。メタデータが変更されたときに通知を生成しようとしています。非同期タスクを呼び出す

これを実装するために作成した非同期タスクは次のとおりです。

public class updateMetadata extends 
     AsyncTask<String, Void, PlaylistSong<BaseArtist, BaseAlbum>> { 

    private static final String TAG = updateMetadata.class.getSimpleName(); 
    private PlaylistSong<BaseArtist, BaseAlbum> oldSong = null; 
    private PlaylistSong<BaseArtist, BaseAlbum> newSong = null; 
    private metadataHarvester fetchMetadata = new metadataHarvester(); 
    private String streamUrl = null; 

    @Override 
    protected PlaylistSong<BaseArtist, BaseAlbum> doInBackground(String... urls) { 
     for (String url : urls) { 
      try { 
       oldSong = fetchMetadata.prepareRadioSong(url); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      streamUrl = url; 
     } 

     newSong = oldSong; 

     while (newSong == oldSong) { 
      try { 
       newSong = fetchMetadata.prepareRadioSong(streamUrl); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

     return newSong; 
    } 

    @Override 
    protected void onPostExecute(PlaylistSong<BaseArtist, BaseAlbum> song) { 
     Log.v(TAG, "New Song: " + song.getTitle()); 
    } 
} 

アプリケーションは、2つのリンクされたプロジェクトで構築されています。プロジェクトAは、アプリケーションが初期化され、プロジェクトBにコレクションと再生ロジックが含まれています。私はプロジェクトBでこのタスクを使用したいと思います。ここでは、プロジェクトBの再生機能があります。

protected synchronized void play(final IMediaPlayerWrapper mp) { 

     streamURL = streamFetcher.getStreamUrl(); 
     Log.i(TAG, "Stream URL: " + streamURL); 
     try { 
      Log.i(TAG, "Testing metadata harvester"); 
      radioSong = metadata.prepareRadioSong(streamURL); 
     } catch (Exception e) { 
      Log.w(TAG, e); 
     } 
     updateMetadata(radioSong); 
     currentPlaylistManager.clearPlaylist(); 
     currentPlaylistManager.appendSongAtEnd(radioSong); 
     listenerInformer.informCurrentSongChangeListener(radioSong); 
     try { 
      mp.setSong(radioSong, streamURL); 
      mp.play(); 
      if (mp.isPlaying()) { 
       setPlayerState(PlayerState.PLAY); 
      } 
     } catch (Exception e) { 
      Log.w(TAG, e); 
      setPlayerState(PlayerState.ERROR); 
     } 


     updateMetadata metadataChecker = new updateMetadata(); 
     metadataChecker.execute(streamURL); 
    } 

実行しようとすると、アプリケーションがクラッシュします。ここで

は、完全なエラー・トレースです:

04-04 23:34:34.975: E/WindowManager(18080): Activity ch.ethz.dcg.pancho2.view.radioplayer.RadioPlayerActivity has leaked window [email protected] that was originally added here 
04-04 23:34:34.975: E/WindowManager(18080): android.view.WindowLeaked: Activity ch.ethz.dcg.pancho2.view.radioplayer.RadioPlayerActivity has leaked window [email protected] that was originally added here 
04-04 23:34:34.975: E/WindowManager(18080):  at android.view.ViewRoot.<init>(ViewRoot.java:258) 
04-04 23:34:34.975: E/WindowManager(18080):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) 
04-04 23:34:34.975: E/WindowManager(18080):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
04-04 23:34:34.975: E/WindowManager(18080):  at android.view.Window$LocalWindowManager.addView(Window.java:424) 
04-04 23:34:34.975: E/WindowManager(18080):  at android.app.Dialog.show(Dialog.java:241) 
04-04 23:34:34.975: E/WindowManager(18080):  at android.app.ProgressDialog.show(ProgressDialog.java:107) 
04-04 23:34:34.975: E/WindowManager(18080):  at android.app.ProgressDialog.show(ProgressDialog.java:90) 
04-04 23:34:34.975: E/WindowManager(18080):  at ch.ethz.dcg.pancho2.view.radioplayer.RadioPlayerActivity$5.onClick(RadioPlayerActivity.java:276) 
04-04 23:34:34.975: E/WindowManager(18080):  at android.view.View.performClick(View.java:2485) 
04-04 23:34:34.975: E/WindowManager(18080):  at android.view.View$PerformClick.run(View.java:9080) 
04-04 23:34:34.975: E/WindowManager(18080):  at android.os.Handler.handleCallback(Handler.java:587) 
04-04 23:34:34.975: E/WindowManager(18080):  at android.os.Handler.dispatchMessage(Handler.java:92) 
04-04 23:34:34.975: E/WindowManager(18080):  at android.os.Looper.loop(Looper.java:130) 
04-04 23:34:34.975: E/WindowManager(18080):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
04-04 23:34:34.975: E/WindowManager(18080):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-04 23:34:34.975: E/WindowManager(18080):  at java.lang.reflect.Method.invoke(Method.java:507) 
04-04 23:34:34.975: E/WindowManager(18080):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
04-04 23:34:34.975: E/WindowManager(18080):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
04-04 23:34:34.975: E/WindowManager(18080):  at dalvik.system.NativeStart.main(Native Method) 

私は非同期タスクの私の理解に混乱しています。これは正しい方法ではありませんか?

EDIT:別途回答が追加されました。

+0

基本的に、アクティビティを終了した後にダイアログを表示しようとしています。上記のようなさまざまな理由がありますが、コード内にダイアログが表示されることはありません。ダイアログを使用していますか? –

+0

いいえ、現在の曲が変更された後に新しい曲を記録しようとしています。この段階ではダイアログも何も表示されません。 onSongChangedリスナーが既に設定されています。私はちょうど私が新しい曲のチェックのビットが働いていると確信しているときにそれを呼び出すことができます。 – rahulthewall

+0

あなたのRadioPlayerActivity onclickメソッドにダイアログまたは進行ダイアログを表示しようとしていますか? – Ads

答えて

2

TimerTaskを使用して解決しました。

private void pollMetadata() { 

    lastSong = radioSong; 
    newSong = lastSong; 
    Log.i(TAG, "Old Song: " + lastSong.getTitle()); 
    Log.i(TAG, "New Song: " + newSong.getTitle()); 

    updateMetadataTask = new TimerTask() { 

     @Override 
     public void run() { 
      try { 
       newSong = metadata.prepareRadioSong(streamURL); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      Log.i(TAG, "Old Song: " + lastSong.getTitle()); 
      Log.i(TAG, "New Song: " + newSong.getTitle()); 

      if (newSong.getTitle().equals(lastSong.getTitle())) { 
       Log.v(TAG, "SAME SONG"); 
      } 
      else { 
       Log.v(TAG, "SONG CHANGED"); 
       lastSong = newSong; 

       currentPlaylistManager.clearPlaylist(); 
       currentPlaylistManager.appendSongAtEnd(newSong); 
       listenerInformer.informCurrentSongChangeListener(newSong); 

      } 

     } 
    }; 

    t.schedule(updateMetadataTask, 300, 30000); 
} 
関連する問題