【问题标题】:Error StrictMode$AndroidBlockGuardPolicy.onNetwork [duplicate]错误 StrictMode$AndroidBlockGuardPolicy.onNetwork [重复]
【发布时间】:2014-04-19 04:17:15
【问题描述】:

我创建了 android 应用程序并使用 JSON 从服务器获取数据,但我得到了如下所示的错误:

android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)

我该如何解决这个问题
谢谢

【问题讨论】:

标签: android json


【解决方案1】:

您必须在 MainActivity 类中插入 2 行“StrictMode”,示例如下:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        
        try {
            // JSON here
        } catch (JSONException e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
        catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
        setContentView(R.layout.activity_main);
        Intent intent=new Intent(this,HomeActivity.class);
        startActivity(intent);
    }
}

Aey.Sakon

编辑: 这个答案“解决”了“问题”,但并没有真正解释它,这是重要的部分。

修改 StrictMode 不是修复方法。以及这个异常并不是程序逻辑中的真正错误。这是程序范例中的错误,并且异常告诉您,您不应该在主线程上执行 http 调用,因为它会导致 UI 冻结。正如其他一些答案所暗示的那样,您应该将 http 调用移交给 AsyncTask 类。

https://developer.android.com/reference/android/os/AsyncTask

更改 StrictMode 真的只是告诉应用程序 - 不要让我想起我写了糟糕的代码。它可以用于调试,或者在某些情况下您知道自己在做什么,但通常这不是要走的路。

【讨论】:

  • 谢谢,你拯救了这一天 :)
  • 仅用于调试,不能用于生产模式。 AsyncTask 是要走的路。
  • 任何人都可以展示这种生产方法的未成年人吗?谢谢..
  • 谢谢您,先生。你拯救了我的一天
【解决方案2】:

最好使用AsyncTask 提到的here,这是摆脱Exception 的替代方法:

if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy); 
}

或者这个:

Thread thread = new Thread(new Runnable(){
@Override
public void run() {
    try {
        //Your code goes here
    } catch (Exception e) {
       Log.e(TAG, e.getMessage());
    }
}
});
thread.start();

在您的 Activity 中出现 Exception

【讨论】:

  • 我会说这是一个更好的答案,因为它提供了替代方案。正如这里所解释的stackoverflow.com/a/6986726/1528483你应该将你的网络操作移动到一个线程
  • 工作得很好,谢谢兄弟!!!
  • @vinidog glade 从你这里到这里 快乐编程
  • @vinidog 很高兴收到您的来信快乐编程
【解决方案3】:

在创建方法后添加两行

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 2022-11-28
    • 2017-11-04
    • 1970-01-01
    相关资源
    最近更新 更多