调用异步任务

2024-03-29

我正在播放广播流。我想在流中的歌曲发生变化时生成通知。我正在使用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 包含集合和播放逻辑。我想在项目 B 中使用这个任务。这是 play 函数(在项目 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 com.android.internal.policy.impl.PhoneWindow$DecorView@4053e8f0 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 com.android.internal.policy.impl.PhoneWindow$DecorView@4053e8f0 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)

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

编辑:答案单独添加。


使用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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调用异步任务 的相关文章

随机推荐

  • EF 迁移:回滚上次应用的迁移?

    这看起来是一个非常常见的任务 但我找不到简单的方法来完成它 我想撤消上次应用的迁移 我本来期望一个简单的命令 比如 PM gt Update Database TargetMigration 1 相反 我能想到的是 PM gt Get Mi
  • 如何增加 Oxyplot 中轴的绘图区域?

    我正在编写一个实用程序来通过电子邮件发送堆积柱形图 该柱形图显示每个人的任务 现在我正在使用PngExporter in OxyPlot WindowsForms导出绘图 但我似乎无法弄清楚如何控制图像的下限 用户名可能很长并且会溢出到外面
  • 通过我的应用程序更新和删除 Android 中的日历事件

    谁能告诉我我该怎么做修改 编辑 和删除android日历事件这是用户自己使用我的 Android 应用程序添加的 我已经尝试了很多 但没有一个对我来说效果很好 我是第一次处理这些日历 我们有解决方案吗 看看这个问题 堆栈溢出 https s
  • android - 上传文件时发送参数

    我有这段代码http pastebin com VrMNuxcv http pastebin com VrMNuxcv它成功地将文件从我的 android 上传到服务器 不过 我希望能够随它一起发送几个字符串参数 如果可能的话 您能否告诉我
  • 在 html 字符串中渲染 ViewComponent

    假设我有一个名为 MyComponent 的 ViewComponent 从 ASP NET Core 1 1 开始 我可以通过在 razor view cshtml 页面中编写此 ViewComponent 来呈现此 ViewCompon
  • 在 Scilab 中求解 ODE

    我正在尝试做一些电路分析Scilab通过解决一个ODE 但我需要改变一个ODE取决于函数的当前值 我已经实施了该解决方案Scala using RK4方法并且效果完美 现在我正在尝试做同样的事情 但是使用标准函数Scilab 但它不起作用
  • 如何在 Delphi 7 中使用 Indy 10 进行 NTLM 身份验证?

    我想在 Delphi 7 中使用 Indy 10 组件进行 NTLM 身份验证 这是我的源代码 uses Windows Messages SysUtils Variants Classes Graphics Controls Forms
  • 如何使 matplotlib 图表看起来像这样专业完成? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 默认的 matplotlib 图表看起来确实没有吸引力 甚至不专业 我尝试了几个包 包括seaborn和prettyplotlib 但这两个都只
  • Crashlytics 控制台显示加载程序、已启用 Crashlytics 且设置正确,但无法获取崩溃报告?

    我有一个具有两种构建类型的 Android 应用程序 一是Debug另一个是Release the issue我面临的是我的Debug Build正在向 Crashlytics 和我的发送崩溃报告Release Build不会向 Crash
  • Google App 脚本中的线程

    是否可以在 Google Apps 脚本中进行线程处理 目前我正在以编程方式设置触发器来执行线程 有没有更好的办法 布鲁斯 麦克菲尔森就是一个很好的例子 他的例子Apps 脚本中的并行处理 https ramblings mcpher co
  • 我在使用 m2eclipse 时遇到构建错误,但在命令行上使用 maven2 时却没有构建错误 - 是我的 m2eclipse 配置错误吗?

    我安装了 m2eclipse 在 Eclipse 中构建一个 java 项目 我导入项目如下 Import gt Maven gt Existing Maven Projects gt Import Maven Projects gt Se
  • Intellij 检查更新:无法连接

    下面的屏幕截图已经出现好几天了 其他人看到这个吗 注意 为了确保这不是一般的连接错误 除了能够发布此软消息之外 我还进行了 github pull 这有力地表明我的网络代理已被正确禁用 并且工作正常 所以这条消息令人费解 要解决此问题 选择
  • 为什么windbg命令以.开头或者 !

    之间有什么区别吗 和 WinDbg 中有不同类型的命令 常规命令 例如kb适用于调试会话 例如 显示堆栈转储等 元命令以点为前缀 例如 load 元命令适用于调试器本身 例如 加载扩展 显示帮助等等 扩展命令以感叹号为前缀 例如 analy
  • 通过克隆/推/拉传播远程位置

    我们的项目使用了几个第三方开源库 其中一些需要自定义修改 对于每个库 我们创建了自己的本地 git 存储库 并将原始源位置添加为vendor远程 从那里克隆 根据需要修改它并将其推送到内部远程存储库 我们称之为origin 然后 这些存储库
  • 从数组公式返回单个单元格

    我想从这个公式中获得一个值 即收盘价 GoogleFinance NASDAQ AAPL close 12 13 2012 1 1 相反 此公式填充 2 个标题行 日期 收盘价 然后填充两个值 日期和收盘价 529 69 有没有办法只返回收
  • android.hardware.camera2.CaptureRequest 可以与 OpenCV 一起使用吗?

    我已经为此工作好几天了 我有一个基于 OpenCV JavaCameraView 的项目 我正在尝试与 Android 集成android hardware camera2 CaptureRequest我用来控制相机对光的敏感度的对象 Th
  • 当尝试将重复对象插入集合时,正确的 .NET 异常抛出是什么?

    我有一个 Asset 对象 它有一个属性 AssignedSoftware 它是一个集合 我想确保同一个软件不会多次分配给资产 在 Add 方法中 我检查软件是否已存在 如果存在 我想抛出异常 是否有我应该抛出的标准 NET 异常 或者最佳
  • 将 pandas 0.13.0“打印数据帧”更改为像早期版本中那样打印数据帧

    在 pandas 的新版本 0 13 0 中 数据帧 df 使用以下命令打印在一长串数字中 df or print df 而不是像以前那样进行概述 现在只能使用 df info 是否可以更改默认的 df 或 print df 命令以显示 I
  • 将 youtube url 转换为 iframe 嵌入代码

    我一直在尝试找到一个正则表达式模式来用 iframe 嵌入代码 C 替换字符串中的所有 youtube URL 显然必须提取视频 ID 以下是应匹配的 url 模式 http www youtube com watch v bSiDLCf5
  • 调用异步任务

    我正在播放广播流 我想在流中的歌曲发生变化时生成通知 我正在使用streamscraper http code google com p streamscraper 来获取当前流的元数据 并且我尝试在元数据更改时生成通知 这是我为实现此目的