如何从网络中获取json数据信息
2017-08-09 11:52
393 查看
今天带大家看一下如何从网络中获取json数据信息!
首先看一下最终的效果图
json文件:
![](https://img-blog.csdn.net/20170809114558888?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTHVja193aHI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
实现效果:
![](https://img-blog.csdn.net/20170809114402798?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTHVja193aHI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
要实现这个小程序,首先要看一下我们的实现步骤:
1、创建一个ListView控件 使用4 个步骤显示基本数据
2、在initData方法中 使用HttpUrlConnetion把地址中的Json字符串请求回来
3、把Json字符串解析成NewsData数据类型
4、在Adapter中的getView方法中 把NewsData中的标题和描述 先显示在控件
5、因为NewsData中还保存了每一个条目的 图片地址
6、getView方法中使用网络请求把每一个图片请求回来
7、图片回来后,使用OnUIThread方法把图片资源加载在ImageView控件上
OK,下面来看一下它是如何实现的:
构成:
![](https://img-blog.csdn.net/20170809114712939?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTHVja193aHI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
activity_main.xml:
list_item.xml:
MainActivity.java:
当然,最重要的添加网络权限:
好了,这就是实现代码的全过程了,希望对大家有所帮助!
首先看一下最终的效果图
json文件:
实现效果:
要实现这个小程序,首先要看一下我们的实现步骤:
1、创建一个ListView控件 使用4 个步骤显示基本数据
2、在initData方法中 使用HttpUrlConnetion把地址中的Json字符串请求回来
3、把Json字符串解析成NewsData数据类型
4、在Adapter中的getView方法中 把NewsData中的标题和描述 先显示在控件
5、因为NewsData中还保存了每一个条目的 图片地址
6、getView方法中使用网络请求把每一个图片请求回来
7、图片回来后,使用OnUIThread方法把图片资源加载在ImageView控件上
OK,下面来看一下它是如何实现的:
构成:
activity_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.weekone.MainActivity" > <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>
list_item.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp" > <ImageView android:id="@+id/iv" android:layout_width="100dp" android:layout_height="80dp" android:scaleType="fitXY" /> <LinearLayout android:layout_width="match_parent" android:layout_height="80dp" android:orientation="vertical" android:layout_toRightOf="@+id/iv" > <TextView android:id="@+id/tv_title" android:layout_width="match_parent" android:layout_height="30dp" android:text="标题" android:gravity="center_vertical" android:textSize="20sp" android:singleLine="true" /> <TextView android:id="@+id/tv_summary" android:layout_width="match_parent" android:layout_height="50dp" android:text="描述" /> </LinearLayout> </RelativeLayout>
MainActivity.java:
import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import com.example.weekone.bean.NewsData; import com.google.gson.Gson; 4000 public class MainActivity extends Activity { ListView lv; NewsData nb; MyAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //1、创建一个ListView控件 使用4 个步骤显示基本数据 lv = (ListView) findViewById(R.id.lv); initData(); adapter = new MyAdapter(); lv.setAdapter(adapter); } //创建适配器 class MyAdapter extends BaseAdapter{ @Override public int getCount() { // TODO Auto-generated method stub if(nb != null){ return nb.getData().size(); } return 0; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } @Override public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder holder ; if(convertView == null){ convertView = View.inflate(MainActivity.this, R.layout.list_item, null); holder = new ViewHolder(); holder.iv = (ImageView) convertView.findViewById(R.id.iv); holder.tv_title = (TextView) convertView.findViewById(R.id.tv_title); holder.tv_summary = (TextView) convertView.findViewById(R.id.tv_summary); convertView.setTag(holder); }else{ holder = (ViewHolder) convertView.getTag(); } holder.tv_title.setText(nb.getData().get(position).getNews_title()); holder.tv_summary.setText(nb.getData().get(position).getNews_summary()); //6、getView方法中使用网络请求把每一个图片请求回来 //使用一个线程把 图片加载回来 new Thread(new Runnable() { @Override public void run() { //5、因为NewsData中还保存了每一个条目的 图片地址 final Bitmap img = getImg(nb.getData().get(position).getPic_url()); //7、图片回来后,使用OnUIThread方法把图片资源加载在ImageView控件上 runOnUiThread(new Runnable() { public void run() { holder.iv.setImageBitmap(img); } }); } }){}.start(); return convertView; } } //listview优化的holder static class ViewHolder{ TextView tv_title; TextView tv_summary; ImageView iv; } protected Bitmap getImg(String path) { Bitmap bit = null; try { URL url = new URL(path); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //默认是get请求 如果想使用post必须指明 connection.setRequestMethod("GET"); connection.setReadTimeout(5000); connection.setConnectTimeout(5000); int code = connection.getResponseCode(); if(code == 200){ InputStream inputStream = connection.getInputStream(); //因为该地址是一个图片的地址,所以返回的数据流就是一个图片的数据流 //直接用该图片的数据流 转换成 一个Bitmap bit = BitmapFactory.decodeStream(inputStream); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return bit; } /** * 使用Http请求把json请求回来 * 使用Gson把数据装换成NewsData类型 */ private void initData() { new AsyncTask<String, String, String>(){ @Override protected String doInBackground(String... params) { //2、在initData方法中 使用HttpUrlConnetion把地址中的Json字符串请求回来 String result = getData(); return result; } @Override protected void onPostExecute(String result) { //3、把Json字符串解析成NewsData数据类型 Gson gson = new Gson(); //然后把json数据使用Gson转换成NewsData nb = gson.fromJson(result, NewsData.class); //4、在Adapter中的getView方法中 把NewsData中的标题和描述 先显示在控件 //改变数据后 刷新adapter adapter.notifyDataSetChanged(); super.onPostExecute(result); } }.execute(); } protected String getData() { String result = ""; try { URL url = new URL("http://api.expoon.com/AppNews/getNewsList/type/1/p/1"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); int code = conn.getResponseCode(); if(code == 200){ InputStream is = conn.getInputStream(); //把数据流中的json数据 转换成字符串 ByteArrayOutputStream bos = new ByteArrayOutputStream(); int len = -1; byte[] buff = new byte[1024]; while((len = is.read(buff)) != -1){ bos.write(buff, 0, len); } result = new String(bos.toByteArray()); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return result; } }
当然,最重要的添加网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
好了,这就是实现代码的全过程了,希望对大家有所帮助!
相关文章推荐
- 如何从网络中获取json数据信息(补)
- 网络API下获取天气json数据信息
- 关于如何获取天气预报信息,JSON数据
- 如何将JSON数据通过Get方法获取数据
- Servlet如何获取ajax中以json格式传入的数据
- 用异步获取网络数据Json
- php的curl获取https加密协议请求返回json数据进行信息获取
- 获取网络上的json数据
- 如何使用JSON Framework库解析与生成json数据(iphone网络篇二)
- jquery用ajax方式从后台获取json数据后如何将内容填充到下拉列表
- 迭代网络数据头信息 以及获取客户端真实IP
- Android网络开发中如何使用JSON进行网络通信---Android JSON数据通讯方法解析
- 【android初级】之Android之从网络上获取数据(图片,网页,xml,json等)
- Android开发18——获取网络资源之json数据
- Android网络开发中如何使用JSON进行网络通信---Android_JSON数据通讯方法解析
- 网络中获取json数据
- Java后台 如何获取 application/json的 字符串的形式的json数据
- jquery用ajax方式从后台获取json数据后如何将内容填充到下拉列表
- RxVolley进行网络请求(get方式),获取json数据
- 如何从EditText 获取信息(包含强制转换数据类型)