【问题标题】:Android web api call without asynctask没有 asynctask 的 Android Web api 调用
【发布时间】:2014-09-24 07:14:31
【问题描述】:

我需要在单击按钮时进行 api 调用。所以我按照下面的方式做。

btn.setOnClickListener(new View.OnClickListener()
                        {
                            @Override
                            public void onClick(View v) 
                            {
                                try 
                                {
                                     HttpResponse apiResponse = mySingleTonehttpClient.execute(new HttpGet(Url));
HttpEntity resEntity = apiResponse.getEntity();
InputStream instream = resEntity.getContent();
String result = convertInputStreamToString(instream);

    }
}

如果我在 Manifest 文件中设置 targetSDKVersion = 8,此代码工作正常。但是给我 targetSDKVersion = 11 的网络主线程错误。谁能建议我该怎么办?

谢谢,

【问题讨论】:

  • 你必须使用 asynctask 来做更高版本的网络相关工作。
  • 同样使用 asynctask 对于​​网络操作来说不是一个好主意。它们适用于短期操作。在 ThreadPoolExecutor 等 java 库中使用 Thread 类或其他有用的类。

标签: android android-asynctask android-2.2-froyo


【解决方案1】:

这样做的原因是您不应该在 UI 线程中执行可能需要很长时间的事情。因为这样做会导致 UI 被阻止,并且您的应用程序将滞后。

这就是为什么您应该使用 Worker Thread 或 AsyncTask 来执行网络 IO。您可以在 Android 开发者指南中阅读有关如何使用它们以及它们如何与 UI 线程交互的更多信息。

【讨论】:

  • 嘿Chnoch。明白了你的意思,但为什么它在使用 tagetSDKVersion = 8 而不是 11 时运行良好?
  • 我还没有找到我假设的任何来源,但我猜谷歌在某些时候意识到如果他们只是执行这个约定会更好。这样,新手开发人员就已经开始正确地做事了。因此,在 API 8 和 11 之间的某个地方,他们必须使用来自单独线程的网络(除其他外)。
  • 所以你的意思是我必须使用异步任务或线程来发出 http 请求。顺便说一句,我在这里也尝试过使用 Thread 作为您的建议,但仍然遇到同样的问题。所以要在这里使用异步任务。感谢您的回答。周杰伦Stepin
  • 是的,现在你必须使用不同的线程。使用常规线程的问题是您可能会遇到不同的问题,例如不允许您从 UI 线程外部更改 UI 中的任何内容。这就是为什么 Android 框架包含某些特定类(例如 AsyncTask 或 Worker Threads)来创建可用且良好的解决方案。
【解决方案2】:

您不应该在应用程序的主/UI 线程上进行网络调用。您可以启动新的工作线程,该线程将在单独的线程中运行,而不是在 UI 线程中运行。

【讨论】:

    猜你喜欢
    • 2016-12-30
    • 2012-06-15
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多