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的情况?的主要内容,如果未能解决你的问题,请参考以下文章

Android中finish掉其它的Activity

如何从处理程序中删除所有回调?

在 Socket.io android 客户端 v1.4 中处理回调

在 React 中,如何将“this.state”作为参数传递给“socket.on”回调函数?

finish() 和 Activity 生命周期

linux中的socket回调