2012-04-04 76 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()); 
    } 
} 

该应用程序构建在两个链接的项目上。项目A是应用程序初始化的位置,项目B包含收集和播放逻辑。我想在Project 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) 

在我的异步任务的理解,我很困惑。这不是使用它们的正确方法吗?

编辑:单独答复。

+0

基本上,您正试图在退出活动后显示对话框。发生上述情况有各种原因,但在代码中没有看到有关对话的任何信息。你使用对话框吗? – 2012-04-04 21:59:13

+0

不,我正在尝试在当前歌曲发生变化后记录新歌曲。在这个阶段没有对话或任何东西。我已经设置了onSongChanged监听器。我可以打电话,当我确定检查新歌曲位正在工作。 – rahulthewall 2012-04-04 22:38:54

+0

您是否试图在RadioPlayerActivity onclick方法中显示任何对话框或进度对话框? – Ads 2012-06-13 10:02:42

回答

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); 
}