19

我正在创建一个分配项目,我是 Android 新手,我想从非常常见的 url 访问 json http://api.androidhive.info/contacts/

问题:我正在尝试读取 url 并获取并解析此 url 返回的 json,

我已经在我的 AndroidManifest.xml 中添加了以下行

<uses-permission android:name="android.permission.INTERNET"/>

偏好:我的安卓偏好是

<uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
  1. API 18 级
  2. 安卓 4.3

这就是我试图阅读网址的方式

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();

错误信息

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 示例 http://www.androidhive.info/2011/11/android-xml-parsing-tutorial/

4

3 回答 3

19

Exception实际上告诉你你做错了什么。您没有使用另一个线程来执行NetworkOperations。相反,您在 UI 线程上执行网络操作,这在 Android 上不能(不)工作。

连接到 url 的代码应该在 UI 线程之外的AsyncTasks doInBackground()方法中执行。

看看这个关于如何使用 AsyncTask 的问题:如何使用 AsyncTask

于 2013-11-02T09:36:58.427 回答
13

更新答案:

可能长时间运行的操作(例如网络操作)应在工作线程中完成。

为更长的操作创建工作线程的最有效方法是使用AsyncTask类。只需扩展AsyncTask并实现doInBackground()方法即可执行工作。

许多库可用于进行网络操作,例如Volley改造等。


老答案:

在您的活动onCreate方法中添加以下行

StrictMode.ThreadPolicy policy = new
StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
于 2013-11-02T10:04:45.327 回答
12

使用以下代码。

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 中使用以下代码。

new UpdateTask().execute();
于 2013-11-02T09:52:13.183 回答