错误 StrictMode $AndroidBlockGuardPolicy. onNetwork

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

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

我怎样才能解决这个问题
谢谢你

99994 次浏览

最好使用 AsyncTask作为提到的 给你,一个替代只是摆脱 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();

在你的活动中发生 Exception

你必须在 MainActivity 类中插入两行“ 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);
}
}

Sakon

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

修改 StrictMode 不是修复。除此之外,这个异常在程序逻辑中也不是一个真正的错误。它是和错误的程序范例和异常告诉你,

您不应该在主线程上执行 http 调用,因为这会导致 UI 冻结。正如其他一些答案所建议的那样,您应该将 http 调用传递给 AsyncTask 类。

Https://developer.android.com/reference/android/os/asynctask

改变 StrictMode 实际上只是告诉应用程序-不要提醒我写坏代码。它可以用于调试,或者在某些情况下,您知道自己在做什么,但通常不是正确的方法。

只需在创建方法后添加两行

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