关于线程的Android/Java决策

关于线程的Android/Java决策,java,android,multithreading,user-interface,Java,Android,Multithreading,User Interface,好的,我在玩了一点Android SDK之后,决定开发一个完整的应用程序。不一定要在商店里发布(我真的没有可以使用的工具来进行适当的QA,因此感觉不对劲;我只能在我的一台个人设备上进行测试),它主要只是一个个人项目,用于娱乐和学习。最后,我决定使用一个摄像头应用程序,因为我经常使用我的摄像头,所以如果我成功的话,这是我最终实际使用的应用程序,也是因为我对Android L中新的Camera2 API的功能感到非常兴奋,并想尝试一下 无论如何,我一直在思考应用程序的设计/体系结构有一段时间了,我遇

好的,我在玩了一点Android SDK之后,决定开发一个完整的应用程序。不一定要在商店里发布(我真的没有可以使用的工具来进行适当的QA,因此感觉不对劲;我只能在我的一台个人设备上进行测试),它主要只是一个个人项目,用于娱乐和学习。最后,我决定使用一个摄像头应用程序,因为我经常使用我的摄像头,所以如果我成功的话,这是我最终实际使用的应用程序,也是因为我对Android L中新的Camera2 API的功能感到非常兴奋,并想尝试一下

无论如何,我一直在思考应用程序的设计/体系结构有一段时间了,我遇到了一个我自己无法真正解决的潜在问题,因为我不仅对这种性质的GUI编程非常熟悉,而且对Java和Android SDK也不是100%熟悉。他们都不在我的日常工作范围之内

现在我知道我真的需要将我的UI线程与其他线程分开,但我不确定的是,首先,我应该在哪些方面投入额外的线程(我正在考虑一个处理图像捕获和存储,另一个处理设置?也许这已经结束了)以及是否有UI线程通过事件与之通信的后台线程,或者只是在需要时生成线程。可能是一个中间后台线程,在UI线程和任何需要完成的后台处理之间进行仲裁?我想问的是,我如何决定这些事情?是否有一般/最佳做法


我真的这么问是因为我想把这件事做好,并事先彻底计划好应用程序,因为在过去,我发现如果我直接投入其中,我会很容易感到困惑,最终失去信心,放弃项目。我希望有人能帮忙。这不是一个问题,我很容易找到这样的方式,谷歌将提供令人满意的结果。

< P>我想你可能会考虑这样想:< /P> UI线程是运行大多数东西的地方。它有时也被称为“主”线程,因为它是,嗯。。。主线

除非您的程序非常复杂,否则您可能不需要担心线程的体系结构。所有你需要担心的是从UI线程中得到慢的东西。就这样。你不在乎它们去哪里,只是不在乎UI线程

如果你买了它,有一些不错的选择:

  • Intent服务:如果您需要在“后台”中运行的方法有无效的返回类型,那么Intent服务是完美的解决方案。您可以使用意图与它通信,因为它只有一个线程,所以您提交给该线程的任务将按顺序运行
  • AsyncTask:这些都充满了问题,但人们用它们完成了很多编程。它们在大约6个线程的池中运行,但(令人惊讶的是!)仍然按顺序运行
  • 您自己的Java Executor:如果您需要类似于异步任务的行为,但需要更多控制,请使用此选项
  • 每个任务新线程:不要这样做。真的
  • 但是,在任何一种情况下,您都不关心任务在哪个线程上运行。您可以制定一个关于目标设备上有意义的线程数量的策略,然后在其中一个设备上运行慢速运行


    …和“慢”应该包括所有I/O:数据库、文件系统、网络等,以及主要计算。

    < P>我想你可以这样考虑:

    UI线程是运行大多数东西的地方。它有时也被称为“主”线程,因为它是,嗯。。。主线

    除非您的程序非常复杂,否则您可能不需要担心线程的体系结构。所有你需要担心的是从UI线程中得到慢的东西。就这样。你不在乎它们去哪里,只是不在乎UI线程

    如果你买了它,有一些不错的选择:

  • Intent服务:如果您需要在“后台”中运行的方法有无效的返回类型,那么Intent服务是完美的解决方案。您可以使用意图与它通信,因为它只有一个线程,所以您提交给该线程的任务将按顺序运行
  • AsyncTask:这些都充满了问题,但人们用它们完成了很多编程。它们在大约6个线程的池中运行,但(令人惊讶的是!)仍然按顺序运行
  • 您自己的Java Executor:如果您需要类似于异步任务的行为,但需要更多控制,请使用此选项
  • 每个任务新线程:不要这样做。真的
  • 但是,在任何一种情况下,您都不关心任务在哪个线程上运行。您可以制定一个关于目标设备上有意义的线程数量的策略,然后在其中一个设备上运行慢速运行


    …和“慢”应包括所有I/O:数据库、文件系统、网络等,以及主要计算。

    您希望使事情尽可能简单。您不需要线程来设置设置,也不需要中间线程。这些事情只会造成不必要的麻烦。您只需要从UI线程中删除长时间运行的操作

    首先看一下Android框架为简化多线程而提供的结构。这将有助于简化您的应用程序。这些措施包括和。如果这些不能满足您的需求,请查看包装。使用原始线程通常是不可取的


    另一个可能派上用场的图书馆是图书馆。这将防止使用AsyncTask时可能发生的内存泄漏。

    您希望使事情尽可能简单。您不需要线程来设置设置,也不需要中介线程