【问题标题】:Android no Network in Main Thread and no View update in external thread [duplicate]Android主线程中没有网络,外部线程中没有视图更新[重复]
【发布时间】:2013-05-17 21:21:45
【问题描述】:

我编写了结合了小部件、服务同步小部件和用于配置小部件的活动的应用程序。

我已开始向服务器进行网络传输以获取天气数据,但应用程序崩溃了。堆栈调试后,我得到 network in main thread exception

经过一段时间的谷歌搜索,我已经将所有网络通信重写为 AsyncTask 但是......运行应用程序给了我错误

只有创建视图层次结构的原始线程才能触及它的 意见。

现在我卡住了 - http 客户端获取的数据必须推送到一组 LinearLayouts 和 TextViews/ImageViews 中。 7 天的天气给了我一大堆 - 比 layout.xml 可以处理的还要大。

我在问 - 如何在线程中运行 HTTP 同步(因为主线程网络访问给了我异常)并通过 View.add(object) 在线程中同步视图给了我:

> E/AndroidRuntime(965): FATAL EXCEPTION: AsyncTask #1
> E/AndroidRuntime(965): java.lang.RuntimeException: An error occured while executing doInBackground()
> E/AndroidRuntime(965):        at android.os.AsyncTask$3.done(AsyncTask.java:278)
> E/AndroidRuntime(965):        at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
> E/AndroidRuntime(965):        at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
> E/AndroidRuntime(965):        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
> E/AndroidRuntime(965):        at java.util.concurrent.FutureTask.run(FutureTask.java:137)
> E/AndroidRuntime(965):        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
> E/AndroidRuntime(965):        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
> E/AndroidRuntime(965):        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
> E/AndroidRuntime(965):        at java.lang.Thread.run(Thread.java:856) 
> E/AndroidRuntime(965): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

有什么想法吗?

【问题讨论】:

  • The Stackoverflow search gives you 459 results for NetworkOnMainThreadException。我觉得这个问题每隔一天就会被问一次。
  • 公平地说,OP确实说他研究了NetworkONMainThreadException的原始问题并将所有网络内容放在AsyncTask中,但现在又遇到了这个问题。这种类型的问题被问得太频繁了,但至少在这种情况下,OP 已经做了一些研究并试图自己解决问题
  • @codeMagic 哦,我完全跳过了问题的底部。我刚刚读了NetworkONMainThreadException 并关闭了。对不起,马特乌斯。

标签: android multithreading networking android-asynctask views


【解决方案1】:

我猜您正在尝试更新doInBackground() 中的Views。您需要在onPostExecute() 或其他方法之一中执行此操作,因为doInBackground() 不在UI 线程上运行。如果需要,您还可以将结果传递回 Activity 方法。如果它不是您的Activity 的内部类,那么您可以使用AsyncTask 的构造函数从调用Activity 接收params,如果您需要将context 或其他引用传递给它

如果您已经这样做了,请发布您的AsyncTask,以便我们了解发生了什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    相关资源
    最近更新 更多