Android AsyncTask的问题 - JavaMail

问题描述 投票:0回答:1

正如标题所说,我遇到了一些多线程的问题。

我正在使用JavaMail来构建一个完全支持收发邮件的电子邮件应用程序。

我有一个从服务器获取邮件的方法,每隔x秒就会启动一个服务。问题是,当我第一次用账户登录并开始从服务器获取邮件时,我无法发送邮件,直到所有邮件被获取并关闭线程。

我对AsyncTasks不是很了解,但这两个类(fetch和sendmail)都是单独声明的,所以我不清楚为什么它们会互相干扰。

java android javamail
1个回答
0
投票

默认情况下。AsyncTask(!!!)所以你的发送任务可能会在所有的获取发生后被排队运行,你可以选择在一个线程池上运行AsyncTasks。

你可以选择在一个线程池上运行AsyncTasks,并使用 AsyncTask.executeOnExecutor,供应 THREAD_POOL_EXECUTOR 作为一个参数。所以现在你的发送任务将在线程池中的N个可用线程上的所有发送完成后得到排队。

也就是说,长期运行的IO操作可能应该在专用的线程池上运行,而不是在THREAD_POOL_EXECUTOR上运行,因为默认的线程池是给短期任务使用的。如果你不这样做,你最终会饿死与UI相关的标准线程池的使用。你真的需要两个或三个或四个线程的专用池用于接收,可能还需要单独的一个或两个或三个线程用于发送。

对于它的价值。AsyncTask 可以追溯到安卓的黑暗时代,遭受了安卓开发团队的反复滥用,现在已经被正式废弃。(万岁!)AsyncTask的模板参数和执行器语法从一开始就是个坏主意;而且使用它太容易出错了。谷歌现在建议你使用 java.util.concurrent 而不是。

ps. 平心而论,AsyncTask设计的年代,手机是个可怜的东西,320x200的显示屏,一个CPU,有两个整线程是个大问题。java.util.concurrent 是要好得多的。

© www.soinside.com 2019 - 2024. All rights reserved.