最有意思的事情,是我和你眼中的世界是这般的不一样。
希望能够和你多交流,认识到我认识不到的世界。
public class MainActivity extends Activity {
private ListView mlistView;
private static String URL = "http://www.imooc.com/api/teacher?type=4&num=30";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
new NewsAsyncTask().execute(URL);
}
private void init() {
mlistView = (ListView) findViewById(R.id.mlistView);
}
// Return Style is List<NewBean>
/**
* 通过private List<NewBean> getJsonData (String url)方法,
* 我们将url所对应的Json格式对象,转化为我们所封装的newBean对象
* @param url
* @return
*/
private List<NewBean> getJsonData (String url){
List<NewBean> newBeanlist = new ArrayList<>();
// 我们要获取json数据中的String类型数据,所以要创建一个方法来获取Json数据。
try {
String jsonString = readStream(new URL(url).openStream());
// Log.d("xys",jsonString);
/**
* ------------->读取Json格式数据的工作<--------------
*
* 1、新建一个JSONObject 对象,给这个对象传入通过readStream 方法读取到的Json信息
* 2、观察网页上Json数据的显示,先对Json数据中的JsonArray进行读取
* 新建一个JSONArray 对象,通过JSONObject的getJSONArray()的方法,传入JSON信息中的标记符
* 3、成功读取data的数据后,将data数据中我们需要的数据载入到NewBean类的对象中加以利用
* 根据JSON数据中的特征,通过一个for循环,对data内多个数据进行读取。
* 4、for循环中,通过jsonArray.getJSONObject(i)的方法读取对应的Array中的对象。
* 这里可以看出,Json中的object和array关系,大概就是View和ViewGroup的关系,
* 两者互相包裹,然后形成一个较为合理的层次。
* 》》》》》》》读取Json格式数据的工作《《《《《《《《《
*/
NewBean newBean ;
JSONObject jsonObject;
jsonObject = new JSONObject(jsonString);
JSONArray jsonArray = jsonObject.getJSONArray("data");
for (int i = 0; i <jsonArray.length() ; i++) {
jsonObject = jsonArray.getJSONObject(i);
newBean =new NewBean();
newBean.newsIconUrl = jsonObject.getString("picSmall");
newBean.newsTitle = jsonObject.getString("name");
newBean.newsContent = jsonObject.getString("description");
newBeanlist.add(newBean);
}
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return newBeanlist;
}
/**
* ------------->读取Json格式数据的工作<--------------
*/
// We need some String params to set into list from rsetJson DATA.So the method need to return a String Style .
/**
* ------------->通过 InputStream 数据流 解析网页返回的数据<--------------
*/
private String readStream(InputStream is ){
// InputStream is the assess by Json ,so the method need to input the DATA InputStream Style for dealing .
InputStreamReader isr ;
String result = "";
// We need read the message line by line from Web by Json.
try {
String line = "";
// 通过uft-8 将 is 的 字节流格式 转化成 字符流格式
isr = new InputStreamReader(is,"utf-8");
// 通过BufferedReader将字符流以buffer的形式读取出来
BufferedReader br = new BufferedReader(isr);
// Using while read message line by line .
while ((line = br.readLine())!=null){
// 将每行读取的信息拼接到字符串result中
result += line ;
// 这样就完成了整个Json信息的读取
}
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
return result;
}
/**
* ------------->通过 InputStream 数据流 解析网页返回的数据<--------------
*/
/**
* ------------->实现了网络的异步访问<--------------
* 在doInBackground 方法中,String... params 是获取的信息,也是处理的信息。
* 在获取到Data之后,需要同onPostExecute 的方法,将我们封装的NewBean对象设置给ListView,给listView设置适配器
*/
class NewsAsyncTask extends AsyncTask<String ,Void ,List<NewBean>> {
@Override
// 在doInBackground 方法中,String... params 是获取的信息,也是处理的信息。
protected List<NewBean> doInBackground(String... params) {
return getJsonData(params[0]);
}
// 在获取到Data之后,需要同onPostExecute 的方法,将我们封装的NewBean对象设置给ListView,给listv设置适配器
@Override
protected void onPostExecute(List<NewBean> newBean) {
super.onPostExecute(newBean);
NewsAdapter adapter = new NewsAdapter(MainActivity.this,newBean);
mlistView.setAdapter(adapter);
}
}
}