我正在构建一个从Web服务器流式传输音乐的应用程序.该应用程序具有使用MediaPlayer进行播放的前台服务.
我的代码基于此示例:http://developer.android.com/guide/topics/media/mediaplayer.html
在该示例中,除了prepareAsync()调用之外没有任何线程.令我困惑的是,当我阅读有关Service类的信息时,我会发现以下信息:
"警告:服务在其托管进程的主线程中运行 - 该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另行指定).这意味着,如果您的服务将要执行任何操作CPU密集型工作或阻塞操作(如MP3播放或网络),您应该在服务中创建一个新线程来完成这项工作.通过使用单独的线程,您将降低应用程序无响应(ANR)错误的风险应用程序的主线程可以保持专用于用户与您的活动的交互."
我问的原因是应用程序有时(通常在失去连接时)会在流式传输音频时冻结UI.我完全理解,如果服务正在使CPU紧张工作,UI会冻结,因为活动和服务在同一个线程上运行.但是,我是否应该期待MediaPlayer如此激烈?也就是说,它应该在一个单独的线程上运行吗?
我试图测试我的PreferenceActivity使用两个不同的PreferenceFragments.我用一个Intent启动Activity,如:
public static Intent getActivityIntent(Context context, Mode mode){
Intent intent = new Intent(context, MyPreferencesActivity.class);
intent.putExtra( PreferenceActivity.EXTRA_SHOW_FRAGMENT, getMainFragmentName(mode));
intent.putExtra( PreferenceActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS, getMainFragmentArguments(mode));
intent.putExtra( PreferenceActivity.EXTRA_NO_HEADERS, true );
return intent;
}
Run Code Online (Sandbox Code Playgroud)
其中getMainFragmentName和getMainFragmentArguments根据模式返回不同的片段和参数.
现在,我的问题是当我用robolectric开始活动时:
Robolectric.buildActivity(MyPreferencesActivity.class)
.withIntent(MyPreferencesActivity.getActivityIntent(Robolectric.application,
MyPreferencesActivity.Mode.FULL))
.attach()
.create()
.postCreate(null)
.start()
.resume()
.get();
Run Code Online (Sandbox Code Playgroud)
我不知道如何确保创建了正确的片段.当我调试代码时,看起来没有创建任何片段.上面的代码不应该足以创建片段吗?
我试图使用PreferenceActivity的阴影并测试:
assertNotNull(shadowPreferenceActivity.getPreferencesScreen());
Run Code Online (Sandbox Code Playgroud)
但那只是失败了.
代码在我的应用程序中完美运行,并创建并添加了正确的片段.