相关疑难解决方法(0)

在等待退出信号时处理InterruptedException(Android中的错误?)

我遇到过下面的代码,我想知道它是否完全符合我的想法:

synchronized(sObject) {
    mShouldExit = true;   
    sObject.notifyAll()    
    while (!mExited) {
      try {
           sObject.wait();
        } catch (InterruptedException ex) {
           Thread.currentThread().interrupt();
        }
     }
}
Run Code Online (Sandbox Code Playgroud)

关于上下文:还有另一个线程检查mShouldExit(在sObject监视器内)并在这种情况下退出.

这看起来对我来说不是一个正确的模式.如果发生中断,它将再次设置中断状态,所以当它返回时sObject.wait(),会出现另一个InterruptedException等等.因此,它永远不会进入真正的等待状态(sObject.wait()),即它永远不会释放sObject监视器.这可能导致无限循环,因为另一个线程无法将mExiting设置为true,因为它永远不会进入sObject的监视器.(所以我认为这个interrupt()电话是错误的,不能在这里使用.)我错过了什么吗?

请注意,代码段是官方Android框架源代码的一部分.

更新:实际上,情况更糟,因为在GL渲染开始时Android中使用了相同的模式.官方源代码GLSurfaceView.GLThread.surfaceCreated():

   public void surfaceCreated() {
        synchronized(sGLThreadManager) {
            if (LOG_THREADS) {
                Log.i("GLThread", "surfaceCreated tid=" + getId());
            }
            mHasSurface = true;
            sGLThreadManager.notifyAll();
            while((mWaitingForSurface) && (!mExited)) {
                try {
                    sGLThreadManager.wait();
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

您可以用类似的方式重现错误:确保您的UI线程还有其中断状态标志,然后添加您的GLSurfaceView并启动GL渲染(通过setRenderer(...),但在某些设备上,确保您的GLSurfaceView具有 …

java multithreading android interrupted-exception

9
推荐指数
1
解决办法
7627
查看次数

如何停止频繁运行GC_CONCURRENT?

我正在使用一个线程,它使用AudioRecord类记录音频,并放在recorderBUffer(这是Short []的链接列表)中,这是一个单独的线程,它对这些数据进行编码并将其放入playerBuffer(链表[]) .为了播放音频我正在使用AudioTrack类和onPeriodicNotification()我从playerBuffer读取数据并将其写入轨道.

代码很简单,直观.但它不应该按照它的方式工作.GC_CONCURRENT一直吃掉,这导致AudioTrack如此频繁地重启(我猜!).我从LogCat收到以下消息: -

04-09 12:25:13.757: E/Constructor(10100): inside constructor 
04-09 12:25:13.757: I/ApplicationPackageManager(10100): cscCountry is not German : INS
04-09 12:25:17.429: E/startRecording(10100): start Recording
04-09 12:25:17.445: I/AudioCapturer(10100): Audio Recorder created
04-09 12:25:17.546: I/Audio Player(10100): Audio Track instance created buffer Size : 2972
04-09 12:25:17.546: I/SpeexThread(10100): Thread Started Successfully..
04-09 12:25:17.734: D/dalvikvm(10100): GC_CONCURRENT freed 55K, 44% free 3208K/5639K, external 408K/517K, paused 4ms+6ms
04-09 12:25:17.945: D/dalvikvm(10100): GC_CONCURRENT freed 1K, 39% free 3765K/6151K, external 408K/517K, paused 3ms+8ms
04-09 12:25:18.148: D/dalvikvm(10100): GC_CONCURRENT freed <1K, …
Run Code Online (Sandbox Code Playgroud)

audio android audio-recording android-2.3-gingerbread

6
推荐指数
1
解决办法
1万
查看次数