使应用程序适用于所有Android版本

时间:2013-09-24 17:47:54

标签: java android html json apache

我创建了一个从服务器提取数据的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();
    }

3 个答案:

答案 0 :(得分:1)

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

在低于3.0的版本中,您可以轻松完成此操作,但在3.0中,当您这样做时,会得到NetworkOnMainThreadException

答案 1 :(得分:1)

看起来你遇到了NetworkOnMainThreadException。 您可以尝试使用以下方式设置严格模式:

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

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

您可以使用Async任务

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


   }   

希望能解决您的问题。

答案 2 :(得分: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数组