在后台背景模式下的Android应用程序减慢了设备

时间:2012-01-05 12:17:49

标签: android multithreading

我的应用程序播放音轨并进入后台。到目前为止,背景音频播放(使用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

2 个答案:

答案 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();
}