错误StrictMode $ AndroidBlockGuardPolicy.onNetwork

use*_*458 56 android json

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

android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
Run Code Online (Sandbox Code Playgroud)

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

小智 131

你必须在MainActivity Class上插入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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Aey.Sakon

  • 仅将其用于调试,而不是在生产模式下。AsyncTask 是正确的选择。 (2认同)

Ars*_*Ali 41

更好地使用这里AsyncTask提到的,一个替代只是摆脱是使用:Exception

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

或这个 :

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();
Run Code Online (Sandbox Code Playgroud)

在您的活动中Exception发生的地方.

  • 我会说这是一个更好的答案,接受,因为它提供的替代品.如此处所述http://stackoverflow.com/a/6986726/1528483您应该将网络操作移动到一个线程 (3认同)

小智 13

只需在create方法后添加两行

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
Run Code Online (Sandbox Code Playgroud)