AlienSwine
AlienSwine
  • 发布:2015-08-16 14:48
  • 更新:2019-04-02 21:57
  • 阅读:4373

tcp socket 使用源生代码监听成功后,阻塞了线程。后台是java的

分类:Native.js

tcp socket 使用源生代码监听成功后,阻塞了线程。
主线程完全卡死了。
有什么办法可以多线程监听啊。
代码如下

function initSocket(host,port){  
    var Socket = plus.android.importClass("java.net.Socket");  
    var PrintWriter = plus.android.importClass("java.io.PrintWriter");  
    var BufferedWriter = plus.android.importClass("java.io.BufferedWriter");  
    var OutputStreamWriter = plus.android.importClass("java.io.OutputStreamWriter");  
    var BufferedReader = plus.android.importClass("java.io.BufferedReader");  
    var InputStreamReader = plus.android.importClass("java.io.InputStreamReader");  
    //  
    var Thread = plus.android.importClass("java.lang.Thread");  
    var Runnable = plus.android.importClass("java.lang.Runnable");  

    socket = new Socket(host, port);  
    outputStreamWriter = new OutputStreamWriter(socket.getOutputStream());  
    bufferWriter = new BufferedWriter(outputStreamWriter);  
    out = new PrintWriter(bufferWriter, true);  

    inputStreamReader = new InputStreamReader(socket.getInputStream());  
    br = new BufferedReader(inputStreamReader);  
    console.log("Initilised");  
}  

function listenSocket(){  
    var msg = br.readLine();  
    while(true){  
        if(msg != null){  
            console.log(msg);  
            //receiveMsg(msg);  
        }  
        msg = br.readLine();     
    }  
}
2015-08-16 14:48 负责人:无 分享
已邀请:
chender

chender - 与人为善

启一个线程来做吧,你这个不是在新启的线程里做的监听,当然会阻塞

hyhezhen

hyhezhen

请问
如果用原生写底层插件,用多线程实现 SOCKET 发送和读取(持续通讯)。上层JS调用
假定JS 可以启动发送线程,那么接收线程,每次检测到传入数据后怎样传送到JS层?
谢谢

  • chender

    通过监听吧

    2015-08-24 09:32

hyhezhen

hyhezhen

实验过了,插件底层函数里
pWebview.evalJS("demo()");
executeScript 的效果好像一样
可以调用网页上的JS函数(比如网页JS代码已有demo函数)

http://www.dcloud.io/docs/sdk/android/
这个要是有更多范例就好了
比如 addJsInterface 等可能做些什么功能

另外底层新开线程,上层调用不会阻塞,已经验证

  • 小郭哥

    能不能传个demo上来啊

    2016-01-16 15:19

y***@126.com

y***@126.com - 技术交流

兄台是怎么新建的线程啊,我的主一直阻塞呢

hyhezhen

hyhezhen

细节不记得了 拿参考的SDK代码来改

FYC

FYC - 80后IT男

学习一下

1***@126.com

1***@126.com

异步就好了,看这个https://segmentfault.com/a/1190000016852548
connect(ip, port) {
let promise = new Promise()
promise.then(
function (data) {
this.pos = new PosMachine(ip, parseInt(port))
this.writer = this.pos.getPosHandle()
}
).catch(
function (e) {
this.pos = null
this.writer = null
Toast('链接打印机失败,请检查')
console.log('链接打印机失败:' + e)
}
)
}
}
PosMachine 是上面代码封装的一个类和题主一样

该问题目前已经被锁定, 无法添加新回复