Android上的线程中的堆栈溢出异常

时间:2011-05-20 12:57:02

标签: android stack-overflow

我正在为计算媒体文件的bpm做代码。我的要求是我必须只播放5秒钟不超过5秒的歌曲。所以我使用Thread.sleep(5000),我调用处理程序消息。它会抛出java.long.stackoverflowexception。

我的代码:

currentThread.start(); 
....    
    public void run() {
        try {
            Log.e("bpm", "in run method");
            BPM2SampleProcessor processor = new BPM2SampleProcessor();
            processor.setSampleSize(1024);
            EnergyOutputAudioDevice output = new EnergyOutputAudioDevice(processor);     
            output.setAverageLength(1024);      
            try {
                player = new Player(new FileInputStream("/sdcard/taxi.mp3"), output); // line no 40
                currentThread.run();  // line no 41
                player.play();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (JavaLayerException e) {
                e.printStackTrace();
            }
           text.setText("bpm is  "+processor.getBPM());
           Log.e("bpm","  bpm is  "+processor.getBPM());            
           Thread.sleep(5000);
       threadHandler.sendEmptyMessage(0);
                         Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }       
    }

private Handler threadHandler = new Handler() 
{
    public void handleMessage(android.os.Message msg) 
    {
     Log.e("calledThread","5seconds");  
     player.close();
    }
};  

log cat:

  05-20 18:05:01.761: ERROR/AndroidRuntime(2777): Uncaught handler: thread Thread-8 exiting due to uncaught exception
  05-20 18:05:02.237: ERROR/AndroidRuntime(2777): java.lang.StackOverflowError
  05-20 18:05:02.237: ERROR/AndroidRuntime(2777):     at java.nio.HeapByteBuffer.<init>(HeapByteBuffer.java:49)
  05-20 18:05:02.237: ERROR/AndroidRuntime(2777):     at java.nio.HeapByteBuffer.<init>(HeapByteBuffer.java:45)
  05-20 18:05:02.237: ERROR/AndroidRuntime(2777):     at java.nio.ReadWriteHeapByteBuffer.<init>(ReadWriteHeapByteBuffer.java:49)
  05-20 18:05:02.237: ERROR/AndroidRuntime(2777):     at java.nio.BufferFactory.newByteBuffer(BufferFactory.java:51)
 05-20 18:05:02.237: ERROR/AndroidRuntime(2777):     at java.nio.ByteBuffer.allocate(ByteBuffer.java:54)
 05-20 18:05:02.237: ERROR/AndroidRuntime(2777):     at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:351)
 05-20 18:05:02.237: ERROR/AndroidRuntime(2777):     at java.nio.charset.Charset.encode(Charset.java:711)
 05-20 18:05:02.237: ERROR/AndroidRuntime(2777):     at java.lang.String.getBytes(String.java:1022)
 05-20 18:05:02.237: ERROR/AndroidRuntime(2777):     at org.apache.harmony.luni.util.Util.getBytes(Util.java:61)
 05-20 18:05:02.237: ERROR/AndroidRuntime(2777):     at java.io.File.properPath(File.java:1362)
 05-20 18:05:02.237: ERROR/AndroidRuntime(2777):     at java.io.FileInputStream.<init>(FileInputStream.java:77)
 05-20 18:05:02.237: ERROR/AndroidRuntime(2777):     at java.io.FileInputStream.<init>(FileInputStream.java:130)
 05-20 18:05:02.237: ERROR/AndroidRuntime(2777):     at beatit.beatit.main2.run(main2.java:40)
 05-20 18:05:02.237: ERROR/AndroidRuntime(2777):     at java.lang.Thread.run(Thread.java:1096)
 05-20 18:05:02.237: ERROR/AndroidRuntime(2777):     at  beatit.beatit.main2.run(main2.java:41)
 05-20 18:05:02.237: ERROR/AndroidRuntime(2777):     at java.lang.Thread.run(Thread.java:1096)

 05-20 18:05:02.237: ERROR/AndroidRuntime(2777):     at java.la
 05-20 18:05:05.573: ERROR/JavaBinder(1276): !!! FAILED BINDER TRANSACTION !!!

2 个答案:

答案 0 :(得分:3)

你的线程一遍又一遍地调用run方法,导致stackoverflow:

currentThread.run();

没有条件阻止它。 (只是为了说清楚,currentThread.start()在某个阶段调用run方法)

答案 1 :(得分:1)

你几乎回答了自己:

currentThread.run();  // line no 41

下面我写了如何处理你的问题的例子:

    AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... params) {
            //put your code here
        }
    };

    try {
        task.execute((Void)null).get(5, TimeUnit.SECONDS);
    } catch(Exception e) {
        e.printStackTrace();
    }
相关问题