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