我的应用程序播放音轨并进入后台。到目前为止,背景音频播放(使用AudioTrack)工作正常。我已经使用服务实现了这个。但是在android os升级(1. 2.2到2.3和2.2到2.3)之后,当用户遍历其他应用程序(如gallary和电子邮件)时,问题盯着现在的背景音频播放卡顿或卡住。
应用程序按主活动上的后退按钮进入后台。虽然使用Home键进入后台时也会出现断断续续的情况。
这是升级吗? 如何检查应用程序或应用程序线程的优先级?
任何线索或某人都面临这样尴尬的问题?
m_thread1 = new Thread(
new Runnable()
{
//! \brief Thread that updates time display and related fields
public void run()
{
int tid,pri;
tid = Process.myTid();
Process.setThreadPriority(Process.THREAD_PRIORITY_MORE_FAVORABLE);
pri = Process.getThreadPriority(tid);
while (!Thread.interrupted())
{
try
{
JNI_performAudioPlayback();
Thread.sleep(10);
break;
}
catch (InterruptedException e)
{
break;
}
}
}
},"threadname"
);
Process.THREAD_PRIORITY_AUDIO Process.THREAD_PRIORITY_BACKGROUND + Process.THREAD_PRIORITY_MORE_FAVORABLE Process.THREAD_PRIORITY_BACKGROUND + Process.THREAD_PRIORITY_FOREGROUND Process.THREAD_PRIORITY_BACKGROUND
总共有7个线程在服务的生命周期中使用上述优先级。
谢谢, JRC
答案 0 :(得分:1)
这段代码正是我想要的,但我不得不稍微修改它以使它适合我。因此:
private void outputTop(){
int count = 0;
int bufferSize = 8*1024;
byte [] data;
Process process = null;
String out = "";
data = new byte[bufferSize];
try { process = Runtime.getRuntime().exec("top -t -n 1"); }
catch (IOException e) {}
if(process != null)
{
BufferedInputStream bis = new BufferedInputStream(process.getInputStream(), bufferSize);
try
{
while ((count = bis.read(data, 0, bufferSize)) != -1)
{
out += org.apache.http.util.EncodingUtils.getAsciiString(data, 0, count);
}
}
catch(IOException e){ }
if (bis != null)
{
try { bis.close();}
catch (IOException e) {}
writeToLogFile(out);
}
}
}
答案 1 :(得分:0)
您可以尝试检测哪些线程占用的CPU资源最多。知道你可以做出进一步的假设。
这是代码示例,用于查看线程的top命令的输出。
int count = 0;
int bufferSize = 8*1024;
Process process = Runtime.getRuntime().exec("top -t -n 1");
BufferedInputStream bis = new BufferedInputStream(process.getInputStream(), bufferSize);
try {
while ((count = bis.read(data, 0, bufferSize)) != -1) {
//output text data
}
} finally {
if (bis != null)
bis.close();
}