在不使用AsyncTask的情况下在Android中执行网络操作

时间:2014-01-15 16:50:00

标签: android multithreading http user-interface

我的问题很简单,我正在寻找有关Android中多线程和网络的有用教程的建议或链接。我看过的每个例子都使用AsyncTask。我想知道的是,您是否可以通过线程和处理程序获取和使用数据?

我知道HTTP请求必须在新线程上完成,否则你会得到NetworkOnMainThreadException,但我想使用线程和处理程序的原因是因为我希望用来自其他线程的所述数据更新UI。

我不是真的在代码之后,只是指向正确的方向。

3 个答案:

答案 0 :(得分:1)

  

我想知道的是,您是否可以通过线程和处理程序获取和使用数据?

是。网络操作只需在后台Thread上完成,无论是使用doInBackground() AsyncTask还是创建新Thread。查看Painless ThreadingProcesses and Threads

  

我希望用其他线程中的所述数据更新UI。

无论您使用什么,仍然需要更新主UI上的Thread。使用除AsyncTask之外的任何其他方法doInBackground()可以非常轻松地完成此操作(onPreExecute()onProgressUpdate()onPostExecute()都在主{{1}上运行}})。

AsyncTask Docs

答案 1 :(得分:1)

Android中的网络操作可以通过以下任何方式完成。

  1. 异步任务
  2. 意图服务
  3. WakefulBroadcastReceiverCommonsWare's WakefulIntentService
  4. 我应该何时使用此选项?

    1. 工作应在约1秒或更短时间内完成 - 异步任务
    2. 工作时间可能超过1秒但不到10秒 - IntentService
    3. 工作可能需要15秒以上 - WakefulBroadcastReceiver

答案 2 :(得分:0)

认为Threads与常规代码相同,区别在于它们是在后台运行的。因此,您必须问自己的问题是:如果我没有运行Handlers,我可以使用Thread吗?答案是,您只需要在涉及的ActivitiesThreads等之间传递Handler对象。

现在,如果您需要有关选择内容的建议。请记住,AsyncTask实际上是一个“改进的”线程,但与流行的信徒相反,它并不适用于长时间运行的进程。例如,如果你想让一个线程运行你的所有应用程序,那么这不是正确的选举。它适用于有目的的任务。

如果要运行长任务,请使用Service。在开始时这有点令人困惑,但这是正确的选举。但要小心,Service不是线程!但是,您可以在其中放置Threads并在它们在其他任何地方运行时对其进行处理。