How to fix NetworkonMainThreadException in Android?
本问题已经有最佳答案,请猛点这里访问。
我正在创建一个分配项目,我是Android新手,我想从非常常见的url
问题:我正在尝试读取url并获取并解析此url返回的json,
我已经在我的AndroidManifest.xml中添加了以下行
1 | <uses-permission android:name="android.permission.INTERNET"/> |
首选项:和我的Android首选项是
1 2 3 | <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> |
这就是我试图读取网址的方式
1 2 3 4 5 6 7 8 | static InputStream is = null; DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); |
错误消息
1 2 3 4 5 6 | 11-02 05:23:47.843: E/AndroidRuntime(2207): FATAL EXCEPTION: main 11-02 05:23:47.843: E/AndroidRuntime(2207): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.me.countrypedia/com.me.countrypedia.MainActivity}: android.os.NetworkOnMainThreadException 11-02 05:23:47.843: E/AndroidRuntime(2207): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 11-02 05:23:47.843: E/AndroidRuntime(2207): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 11-02 05:23:47.843: E/AndroidRuntime(2207): at android.app.ActivityThread.access$600(ActivityThread.java:141) 11-02 05:23:47.843: E/AndroidRuntime(2207): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) |
另外,我正在关注ListView示例的本教程
你的
连接到url的代码应该在例如UI-Thread之外的AsyncTasks
看看这个关于如何使用AsyncTask的问题:如何使用AsyncTask
更新答案:
网络操作等潜在的长时间运行应该在工作线程中完成。
为更长时间的操作创建工作线程的最有效方法是使用AsyncTask类。只需扩展AsyncTask并实现doInBackground()方法即可完成工作。
许多图书馆都可以进行网络操作,如Volley,改造等。
旧答案:
在您的活动
1 2 3 | StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); |
使用以下代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 | private class UpdateTask extends AsyncTask<String, String,String> { protected String doInBackground(String... urls) { DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); return null; } } |
并在您的ManinActivity中使用以下代码。
1 | new UpdateTask().execute(); |