Android AsyncTask 和线程

标签 android multithreading sockets service android-asynctask

我已经如此厌倦了在设计者预期的正常操作之外一步的情况下与 Android 进行较量。我想补充一点,接口(interface)契约也是行为性的,而不仅仅是保持参数相同的情况。比如HONEYCOMB之后对AsyncTask操作的改变:默认采用序列化的方式。

问题:

我们开发专有应用程序;它们可能永远不会出现在 Play 商店中,我们拥有运行它们的所有设备。我们使用 Android 设备来驱动通过 RS 232 或以太网接口(interface)连接的各种类型的硬件。

背景:

我遇到这样一种情况,我们有一个外部设备使用 TCP/IP 套接字定期(异步)连接到 android 平板电脑。因为有与每个连接关联的状态信息,所以我需要在(至少)两个 Activity 期间保持 IP 套接字打开。一般流程是:

:start
Device ----> Connect (to android device)---->Tablet 
Device ----> Send session info-------------->Tablet
Device <---- Send response<------------------Tablet
(a new activity may start here)
Device <---- Send instruction<---------------Tablet 
Device ----> Send response------------------>Tablet
Device <---- Send instruction<---------------Tablet
Device ----> Send response------------------>Tablet
Device <---- Send instruction<---------------Tablet
Device ----> Send response------------------>Tablet
goto start

以上内容略有释义,但它给出了系统的要点。

最初的方法是让进程内服务运行(与应用程序相关联),并使用单独的线程处理异步连接并整理进出设备的请求。共享对象维护服务器线程和连接的状态。

然而,每隔一段时间,前台应用程序需要向设备发送命令。为此,它确保服务器和设备之间存在现有连接,锁定可重入锁(以排除对套接字的并发访问)并启动 AsyncTask,该 AsyncTask 将命令发送到设备并等待响应,在几乎所有情况下,都会在几毫秒内返回。显然,我不能在 UI 线程上发出套接字接收,否则它会导致“NetworkOnMainThreadException”(发送工作正常。另外,我想避免轮询结果,因为它俗气且效率低下。因此,我发出“get(1000L)”,一旦设备响应或在 Android“未响应”错误开始之前超时,它就会返回。

这种方法在 Gingerbread 上非常有效,但我们现在需要将系统升级到 ICS 或更高版本。不幸的是,当我在 Honeycomb 以北的 Android 版本上发出 AsyncTask 时,它永远不会触发 doInBackground。根据调查,默认情况下,在 AsyncTask 上发出的任何内容似乎一次只允许一个线程运行,而且似乎主要服务线程可能算作额外线程。 (虽然我还没有找到任何明确的说法)。

我不想重写整个设备界面,因为它会影响多种产品,而且它们都必须重新测试,考虑到硬件的性质,这将是一个非常耗时的过程。

所以,我的问题是双重的:

1) 有谁知道一种无需大量代码更改即可将 AsyncTask 行为修改为线程限制较少的方法吗?

2) 如果没有,是否有更好的模式可用于此类问题,因为如果我必须重写,我想正确地做;最好不需要轮询任何东西?

我不能发布完整的代码,因为它都包含在 NDA 协议(protocol)中,但是,如果对结构有具体的问题,我可能会删掉一些 fragment 。

最佳答案

我认为您在这里看到的是各种 Android 版本上线程的一些潜在变化。我收集到他们做到了,所以线程可以在 Android 3 的单独内核上运行。?而且,因为很少有程序员擅长实际的并发,所以他们再次关闭了。我想如果你看看上面的帖子,你也许可以让事情回到原来的样子。

顺便说一句,这解决了第一个问题而不是第二个问题。

关于Android AsyncTask 和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18153644/

相关文章:

python - 显示所有连接到套接字服务器的客户端并向其发送数据

c - 为什么我在 C 中使用 UDP 套接字接收文件时会出现一些垃圾字节?

android - 当应用程序处于后台时终止所有 Activity

android - 如何允许 EditText 扩展推开对等控件

android - 如何使应用程序中的字体大小不受更改设置字体大小的影响

android - 如何使用亚马逊等搜索框制作滚动工具栏

ios - iOS:更新tableViewCell无限循环

.net - 经典ASP调用.NET组件-如何处理线程?

java - java中读/写变量的原子操作

sockets - Socket.io 中的 channel