java – Android(在Scala中):StackOverflowError取决于何时启动
发布时间:2020-12-15 02:28:47 所属栏目:Java 来源:网络整理
导读:我有这个简单的Activity(在 Scala中,导入ommited): class TestActivity extends Activity { private val TAG = "TestActivity" private val mHandler = new Handler { override def handleMessage(msg: Message) { Log.d(TAG,"handleMessage") } } private
我有这个简单的Activity(在
Scala中,导入ommited):
class TestActivity extends Activity { private val TAG = "TestActivity" private val mHandler = new Handler { override def handleMessage(msg: Message) { Log.d(TAG,"handleMessage") } } private val mThread = new Thread { override def run { mHandler.sendEmptyMessage(0) Thread.sleep(10) run } }.start override def onCreate(savedInstanceState: Bundle) { super.onCreate(savedInstanceState) setContentView(new TextView(this) { setText("hello,world") }) } } 正如您所看到的,mThread立即启动,运行被尾递归重写,它向mHandler发送一条空消息,短暂休眠并再次发送相同的消息.当活动开始时,我收到此错误: .... D/TestActivity(28224): handleMessage D/TestActivity(28224): handleMessage D/TestActivity(28224): handleMessage D/TestActivity(28224): handleMessage I/dalvikvm(28224): threadid=9: stack overflow on call to Landroid/os/MessageQueue;.nativeWake:VI I/dalvikvm(28224): method requires 8+20+0=28 bytes,fp is 0x43e33310 (16 left) I/dalvikvm(28224): expanding stack end (0x43e33300 to 0x43e33000) I/dalvikvm(28224): Shrank stack (to 0x43e33300,curFrame is 0x43e35fe0) W/dalvikvm(28224): threadid=9: thread exiting with uncaught exception (group=0x40015560) E/AndroidRuntime(28224): FATAL EXCEPTION: Thread-10 E/AndroidRuntime(28224): java.lang.StackOverflowError E/AndroidRuntime(28224): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:223) E/AndroidRuntime(28224): at android.os.Handler.sendMessageAtTime(Handler.java:457) E/AndroidRuntime(28224): at android.os.Handler.sendMessageDelayed(Handler.java:430) E/AndroidRuntime(28224): at android.os.Handler.sendEmptyMessageDelayed(Handler.java:394) E/AndroidRuntime(28224): at android.os.Handler.sendEmptyMessage(Handler.java:379) E/AndroidRuntime(28224): at com.iped.audiotest.MainActivity$$anon$2.run(Activity.scala:20) E/AndroidRuntime(28224): at com.iped.audiotest.MainActivity$$anon$2.run(Activity.scala:22) E/AndroidRuntime(28224): at com.iped.audiotest.MainActivity$$anon$2.run(Activity.scala:22) E/AndroidRuntime(28224): at com.iped.audiotest.MainActivity$$anon$2.run(Activity.scala:22) ... 现在,如果我在创建后不立即启动mThread,就像这样: private val mThread = new Thread { override def run { mHandler.sendEmptyMessage(0) Thread.sleep(10) run } } 并在触摸事件上触发它,例如: override def onTouchEvent(event: MotionEvent): Boolean = { if (event.getAction == MotionEvent.ACTION_DOWN) mThread.start true } 事情会好的. 我无法解释这一点. 解决方法
所以我做了一些实验,我必须得出结论,如果带有尾递归重写运行的线程在其创建的同一表达式中启动,则尾调用优化将失败(或者是导致错误的任何其他原因) ?)
坏: class Test { val mThread = new Thread { override def run { println("hello") run } }.start } 好: class Test { val mThread = new Thread { override def run { println("hello") run } } mThread.start } 附:我正在运行Scala 2.9.1,但由于库大小较小,因此使用2.8.2进行Android开发. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |