socket回调中无法finish Activity的情况?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了socket回调中无法finish Activity的情况?相关的知识,希望对你有一定的参考价值。
遇到一个问题,利用socket发起视频邀请给对方并监听回调,如果对方拒绝就在回调中调用finish。如果是新创建的应用进程,可以正常finish掉。如果不是新建的,就无法finish。 杀进程后重新进入,第一次又可以,之后还是不行。请教一下。
a+=1; 这条指令必须在dosomething()方法执行完毕返回结果后才可以执行,否则就乱了套异步:异步概念和同步相对,当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者(百度上抄的)。理解了同步概念后异步也就不难理解了,以javascript的ajax为例
ajax(arg1,arg2,function()
//回调函数
a=3;
);
a=4;
这个代码段执行完成后一般情况会把a赋值为3而不是4,因为在ajax方法调用后,a=4;这条语句并没有等待ajax()返回结果就执行了,也就是在ajax()执行完成调用回调函数之前,a=4;已经执行了,回调函数再把a赋值为3使之成为最后结果,为此在ajax调用中我们经常会使用回调函数,其实在很多异步处理中我们都会使用到回调函数。
阻塞
阻塞操作是指,在执行设备操作时,若不能获得资源,则进程挂起直到满足可操作的条件再进行操作。 参考技术A 1, 检查 activity 以及 activity 中的handler等是不是作为引用传输给其余activity或者 后台任务中;
2,检查activity 的handler 有没有在ondstroy()中mHandler.removeCallbacksAndMessages(null);
3, 检查activity是不是bind某个需要返回大数据如图片视频的组件。 参考技术B 在ui线程中执行finish
linux中的socket回调
【中文标题】linux中的socket回调【英文标题】:Callback on sockets in linux 【发布时间】:2013-07-29 14:12:12 【问题描述】:有没有办法在 Linux 中将回调函数与套接字关联起来?
例如, 在 connect(s, (struct sockaddr *)peeraddr, sizeof(*peeraddr)) 函数已将客户端与服务器连接后,有没有办法将函数 afterRecv 与 socket- s 相关联,以便在 recv 函数从套接字读取一些数据之后, afterRecv 被调用?
我的套接字是阻塞类型的。这种要求背后的原因是,我正在使用 OpenSSL,它在内部握手期间对套接字进行许多发送/接收调用。如果我修改 OpenSSL,那么修改每一个 recv 会很麻烦。所以我在想我是否可以添加回调来简化我的工作。
流程应该是:
套接字连接逻辑
接收函数
recv 读取数据后,afterRecv 被调用为 recv 上的回调
【问题讨论】:
当您似乎计划重新编译 OpenSSL 的源代码时,将recv()
替换为您自己的版本(环绕原来的 recv()
)就可以了,不是吗?
@alk 是的,这似乎是一个不错的选择。
如果您愿意使用 C++,boost ASIO 库对事件驱动的 I/O 和 SSL 提供了出色的支持。
【参考方案1】:
一些事件库实现了这样的回调钩子:
libev libevent所有图形或 HTTP 服务器库(例如 Gtk/Glib、Qt、LibOnion、...)都提供(或使用)此类事件库(围绕多路复用系统调用,如 poll(2) 等)。
Glib(来自 GTK)和 QtCore(来自 Qt)都是无需任何 GUI 即可使用的事件库
另请阅读C10K problem
【讨论】:
以上是关于socket回调中无法finish Activity的情况?的主要内容,如果未能解决你的问题,请参考以下文章
在 Socket.io android 客户端 v1.4 中处理回调