在非UI线程android中运行代码

时间:2012-09-05 10:10:51

标签: android multithreading handler runnable ui-thread

我有一个图像应用程序,我在显示图像时播放音乐。 现在,我在UI线程中都有两个功能。

我想将其音乐播放部分移动到另一个与UI线程不同的线程中。

我如何实现这一目标?

如果我使用处理程序和runnables,则会出现复杂情况:

run()必须包含要执行的所有内容 但音乐代码遍布整个地方,因为它是基于事件的,并且每次都有不同的代码片段

所以我可以使用handler和runnable实现这个的唯一方法是,如果我有几个runnables,每个都执行特定的功能 这意味着所有音乐代码都不会在同一个线程中运行,它们会在不同的线程中运行 这不是一件好事。

那你怎么做的?

2 个答案:

答案 0 :(得分:0)

我建议使用Service创建Binder - 然后您就可以使用它了。在Service中创建Executor(池中的单个或多个Thread - 取决于您的应用程序结构和事件; Queue实现也是如此)然后通过音乐事件给执行者。

答案 1 :(得分:0)

这就是我所做的:

 public static void startTrack() {
    PLAYER_STATE = IS_PLAYING;
            /*Setup the handler and runnable*/
    mMusicHandler = new Handler() {         
    }; 

    mMusicRunnable = new Runnable() {
        public void run() {
             Log.d(TAG,"inside Music Runnable");
            try {
                mPlayer.start();        
            } catch (IllegalStateException e) {
                Log.d(TAG,"ILLEGAL STATE-START");
                handleIllegalState();
            }
        }
    };
    mMusicHandler.post(mMusicRunnable);

}

public static void startTrack() { PLAYER_STATE = IS_PLAYING; /*Setup the handler and runnable*/ mMusicHandler = new Handler() { }; mMusicRunnable = new Runnable() { public void run() { Log.d(TAG,"inside Music Runnable"); try { mPlayer.start(); } catch (IllegalStateException e) { Log.d(TAG,"ILLEGAL STATE-START"); handleIllegalState(); } } }; mMusicHandler.post(mMusicRunnable); } 因此,只有音乐设置的开始部分才能在不同的线程上完成。