NativeScript / NativeScript/android
questions about background threads
还没有人认领这个 Issue。
- 主要语言
- C++
- 星标
- 563
- 派生
- 144
- 平均合并
- 10 小时 46 分钟
- 30 天内合并 PR
- 14
描述
I know you already said here that all JS runs in UI Thread but i would like to have another look at this.
The reason is that i found out that on IOS the Js code will run on the the thread in has been triggered.
This is actually an amazing feature. Thanks to that i managed to create an OpenCV module that can do live camera processing. In native the image processing is triggered from a background thread, then i call a JS delegate that modifies the image and returns it. All that happens in the background thread!.
It works amazingly. Imagine all the possibilities!
Now obviously i want to look at this on android. I immediately faced a wall on android as the runtime will always make sure the call to v8 JS will be done on the "worker" thread.
I wanted to try things so i decided to debug the runtime and modify the code so that it runs the v8 JS in the thread it is in.
To do that i simply modified the code to make it believe it is always in the worker thread
Now i get a weird error that i dont get. I end with a maximum call stack exceeded:
Process: org.nativescript.demovueopencv, PID: 2587
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:354)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
Caused by: com.tns.NativeScriptException:
Calling js method doInBackground failed
RangeError: Maximum call stack size exceeded
File: "file:///data/data/org.nativescript.demovueopencv/files/app/vendor.js, line: 39669, column: 14
StackTrace:
Frame: function:'ActivityCallbacksImplementation.onStart', file:'file:///data/data/org.nativescript.demovueopencv/files/app/vendor.js', line: 39669, column: 15
Frame: function:'NativeScriptActivity.onStart', file:'file:///data/data/org.nativescript.demovueopencv/files/app/vendor.js', line: 37027, column: 21
at com.tns.Runtime.callJSMethodNative(Native Method)
at com.tns.Runtime.dispatchCallJSMethodNative(Runtime.java:1162)
at com.tns.Runtime.callJSMethodImpl(Runtime.java:1041)
at com.tns.Runtime.callJSMethod(Runtime.java:1028)
at com.tns.Runtime.callJSMethod(Runtime.java:1008)
at com.tns.Runtime.callJSMethod(Runtime.java:1000)
at android.os.AsyncTask_bundle_283_42_AsyncTaskRunner.doInBackground(Unknown Source:20)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
... 4 more
It seems to appear in the native side which i dont get.
Can someone guide me on this?
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
从 test-app/runtime/src/main/java/com/tns/Runtime.java 第 1152 行附近以及第 1162 行的 dispatchCallJSMethodNative 入口开始。复现后台线程调用,并将由此产生的 ActivityCallbacksImplementation.onStart 递归与报告的堆栈跟踪进行比较;完成的标准是确定原因,并记录或修复受支持的线程行为。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- android, java, javascript
- 领域
- mobile-dev
- Issue 类型
- 缺陷
- 难度
- 5/5
- 预计耗时
- 一周以上
- 活跃度
- 停滞
- 描述清晰度
- 需要澄清
- 新手友好度
- 15/100