-1

我创建了一个从服务器提取数据的 jsonobject,但它仅适用于小于 3 的 android 版本(旧版本)。使它适用于所有版本的代码是什么?

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    DefaultHttpClient client;
    client = new DefaultHttpClient();
    HttpGet get = new HttpGet("http://saurabhgoyal.comoj.com/json_test.php");
    HttpResponse r;
    try {
        r = client.execute(get);
        HttpEntity e = r.getEntity();
        InputStream is=e.getContent();
        InputStreamReader isr=new InputStreamReader(is);
        BufferedReader reader=new BufferedReader(isr);
        String results=reader.readLine();
        Toast.makeText(this, results, Toast.LENGTH_SHORT).show();
    } catch (ClientProtocolException e1) {
        // TODO Auto-generated catch block
        Toast.makeText(this, "failure", Toast.LENGTH_SHORT).show();
        e1.printStackTrace();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
4

3 回答 3

1

看起来您遇到了 NetworkOnMainThreadException。您可以尝试使用以下方法关闭严格模式:

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

但是,我建议您将任何长时间运行的操作或网络操作移到后台线程中,例如AsyncTask

在这里,您可以使用异步任务

  protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
   new LongOperation().execute();
}

private class LongOperation extends AsyncTask<Void, Void, Void> {
        String results;
      @Override
      protected void doInBackground(String... params) {
                DefaultHttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet("http://saurabhgoyal.comoj.com/json_test.php");
HttpResponse r;
try {
    r = client.execute(get);
    HttpEntity e = r.getEntity();
    InputStream is=e.getContent();
    InputStreamReader isr=new InputStreamReader(is);
    BufferedReader reader=new BufferedReader(isr);
    results=reader.readLine();

} catch (ClientProtocolException e1) {
    // TODO Auto-generated catch block
    Toast.makeText(this, "failure", Toast.LENGTH_SHORT).show();
    e1.printStackTrace();
} catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}
            return "Executed";
      }      

      @Override
      protected void onPostExecute(String result) {
          Toast.makeText(this, results, Toast.LENGTH_SHORT).show();
      }


   }   

希望能解决您的问题。

于 2013-09-24T17:57:21.623 回答
1

您不应该在需要使用单独线程或进行网络调用的 UI 线程上进行任何网络调用AsyncTask

在 3.0 以下的版本中,您可以侥幸逃脱,但在 3.0 中NetworkOnMainThreadException,您这样做时会得到一个。

于 2013-09-24T17:52:13.397 回答
0

你的答案在这里Json From Url

希望能帮助到你。

如果您更喜欢保存它然后处理它...您可以使用:

try {
        InputStream is = getAssets().open("drillData.json");
        int size = is.available();
        byte[] buffer = new byte[size];
        is.read(buffer);
        is.close();
        String str = new String(buffer, "UTF-8");
        JSONArray arr = new JSONArray(str);

        for (int i = 0; i < arr.length(); i++) {
            list.add(arr.getJSONObject(i));
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    }

例如资产中的 json 数组

于 2013-09-24T18:01:14.080 回答