【问题标题】:Android Honeycomb: NetworkOnMainThreadException even when using AsyncTask and no strict mode?Android Honeycomb:即使在使用 AsyncTask 且没有严格模式时出现 NetworkOnMainThreadException?
【发布时间】:2011-06-08 10:52:15
【问题描述】:

我在使用 Android 3.0 应用时遇到了NetworkOnMainThreadException。 寻找解决方案我找到了this,但如果我理解正确的话,默认设置是关闭严格模式。

另外,我所有的网络访问都在 AsyncTask 中,所以无论如何我都看不到这个异常的意义。

所以,我现在很绝望我应该做些什么来防止这种情况......

亲切的问候, 水母

编辑:

This blog entry 说 AsyncTask 应该足够了,但至少澄清了 StrictMode 点。

解决方案:

我关闭了 StrictMode(保留一些设置可能更好,但我不会被打扰...):

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

之后,我确实遇到了“java.lang.RuntimeException:此线程禁止 HTTP 请求”,但找到了解决此问题的方法 here。不过,我有点困惑,因为AndroidHttpClient 在我的 Android 2.0+ 应用程序中使用时效果很好......

解决方案,第 2 部分

事实证明,使用 AsyncTask 是个好主意,但如果 done wrong... 所以严格模式的反应并没有错。应该听的,嗯? ;)

很高兴知道它默认在 Honeycomb 上激活。

【问题讨论】:

    标签: android android-asynctask android-3.0-honeycomb android-strictmode


    【解决方案1】:

    在 Android Honeycomb StrictMode 中启用,将其关闭在 onCreate() 函数上添加代码...

    @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState); 
            setContentView(R.layout.main);       
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }
    

    【讨论】:

    • 此代码可能是更改策略的正确方法,但处理NetworkOnMainThreadException 的方法几乎总是错误的。如果您检查 OP 的更新,您会发现他们只是不正确地使用了AsyncTask。但是,AsyncTask 或其他一些让网络流量脱离 UI 线程的机制,基本上总是比这种策略更改黑客更好的解决方案。
    【解决方案2】:

    在 Honeycomb 中默认开启 StrictMode。

    请参阅link,特别是penaltyDeathOnNetwork()。我遇到了类似的问题。

    【讨论】:

    • 谢谢...这个新的 API 快让我发疯了。 ^^ 我不明白为什么不认为 AsyncTask 不在主线程中......
    • 我同意。 Thread.run() 有什么问题?为什么他们甚至需要那个?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 2018-10-29
    • 2012-11-16
    • 2015-01-01
    • 2012-12-14
    • 2015-03-11
    • 1970-01-01
    相关资源
    最近更新 更多