我创建了 android 应用程序,并使用 JSON从服务器获取数据,但我得到的错误显示如下:
JSON
android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
我怎样才能解决这个问题 谢谢你
最好使用 AsyncTask作为提到的 给你,一个替代只是摆脱 Exception是使用:
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);