当在 HTML 页面中执行脚本时,页面的状态是不可响应的,直到脚本已完成。虽然在JavaScript中有setInterval和setTimeout函数使javaScript看起来好像使多线程执行,单实际上JavaScript使单线程的,一次只能做一件事情。
可以运行以下示例,检验js的单线程特性。
相关代码请到github查看。
<div id='container'></div>
<script>
window.alert('hi')
setTimeout(function(){
var ul = document.createElement('ul')
var li = document.createElement('li')
var text = document.createTextNode('world')
var container = document.getElementById('container')
li.appendChild(text)
ul.appendChild(li)
container.appendChild(ul)
console.log('done!')
},2000)
</script>123456789101112131415123456789101112131415
如果JavaScript是多线程,在弹出警告框两秒后,页面应该出现一个li标签(内容为world)。事实上因为JavaScript是单线程,所以如果你不点击弹出框的确定按钮,world这个li永远也出不来。
点击确定后
web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性能。您可以继续做任何愿意做的事情:点击、选取内容等等,而此时 web worker 在后台运行。
我们需要把希望单独执行的javascript代码放到一个单独的js文件中,然后在页面中调用Worker构造函数来创建一个线程,参数是该文件路径,参数存放如果是相对地址,那么要以包含调用Worker构造函数语句所在脚本为参照,如果是绝对路径,需要保证同源(协议+主机+端口)。这个文件不需要我们在页面使用script标签显示引用。
var worker = new Worker('src/js/worker.js')11
我们可以看到worker对象只有两个属性,其实是两个回调函数句柄
onerror:当worker运行出现错误,并且没有在worker中ing捕获,会在此捕获
onmessage:当worker向主线程发送消息是调用
在其prototype内有两个重要方法
postMessage:很熟悉的赶脚,之前我们介绍过window对象的postMessage()方法,woker的postMessage方法和window的比较类似,但参数略有不同,只需要传递消息内容就可以,而且支持所有JavaScript原生数据类型,当然不放心的话同样也可以序列化为字符串传递
terminate:终止worker执行,有些worker执行比较慢,主线程可以主动终止其执行
下面我们用web workers重写上面那个例子。
相关代码请到github查看。
test_web_worker.html
<script>
var worker = new Worker('./worker.js')
window.alert('hi')
</script>12341234
worker.js
setTimeout(function(){console.log('done!')},2000)
大家先尝鲜一下,我仅测试读公交卡了。数据可以出来,具体哪些数据有用,需要专业开发者补充完善分享。在此先谢过了。function test_nfc(){
var main = plus.android.runtimeMainActivity()
var Intent = plus.android.importClass('android.content.Intent')
var Activity = plus.android.importClass('android.app.Activity')
var PendingIntent = plus.android.importClass('android.app.PendingIntent')
var IntentFilter = plus.android.importClass('android.content.IntentFilter')
var NfcAdapter = plus.android.importClass('android.nfc.NfcAdapter')
var nfcAdapter = NfcAdapter.getDefaultAdapter(main)
var intent = new Intent(main, main.getClass())
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
var pendingIntent = PendingIntent.getActivity(main, 0, intent, 0)
var ndef = new IntentFilter("android.nfc.action.TECH_DISCOVERED")
ndef.addDataType("*/*")
var intentFiltersArray = [ndef]
var techListsArray = [["android.nfc.tech.IsoDep"], ["android.nfc.tech.NfcA"], ["android.nfc.tech.NfcB"], ["android.nfc.tech.NfcF"], ["android.nfc.tech.Nfcf"], ["android.nfc.tech.NfcV"], ["android.nfc.tech.NdefFormatable"], ["android.nfc.tech.MifareClassi"], ["android.nfc.tech.MifareUltralight"]]
document.addEventListener("newintent",
function() {
console.log('newintent')
setTimeout(handle_nfc_data,1000)
}, false)
document.addEventListener("pause", function(e) {
if (nfcAdapter) {
nfcAdapter.disableForegroundDispatch(main)
console.log('pause')
}
}, false)
document.addEventListener("resume", function(e) {
if (nfcAdapter) {
console.log('resume')
nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray)
}
}, false)
nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray)
}
function handle_nfc_data(){
var main = plus.android.runtimeMainActivity()
var runtimeIntent = main.getIntent()
var b = runtimeIntent.getExtras()
plus.android.importClass(b)
var set = b.keySet()
plus.android.importClass(set)
var sb
var i = set.iterator()
plus.android.importClass(i)
var hasNest = i.hasNext()
var NfcA = plus.android.importClass("android.nfc.tech.NfcA")
var IsoDep = plus.android.importClass("android.nfc.tech.IsoDep")
var Tag = plus.android.importClass("android.nfc.Tag")
while (hasNest) {
var key = i.next()
var v = b.get(key)
if(v instanceof NfcA){
var atqa = v.getAtqa()
var sak = v.getSak()
var tag = g.getTag()
plus.android.importClass(tag)
var techList = tag.getTechList()
console.log('NfcA Atqa=' + atqa + "Sak=" + sak + "techList=" + techList)
}else if(v instanceof IsoDep){
var tag = g.getTag()
plus.android.importClass(tag)
var techList = tag.getTechList()
console.log('IsoDep techList=' + techList)
}else if(v instanceof Tag){
var tag = v
var techList = tag.getTechList()
console.log('Tag techList=' + techList)
}
console.log(key + 'v=' + v)
sb = key + "=" + v + "\n"
hasNest = i.hasNext()
console.log('hasNest=' + hasNest)
}
}