网络请求图片和json解析,在listView中展示出来

来源:互联网 发布:jsonp跨域原理 java 编辑:程序博客网 时间:2024/05/22 02:28
package com.example.weekone;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;/** * 1、创建一个ListView控件   使用4 个步骤显示基本数据 * 2、在initData方法中  使用HttpUrlConnetion把地址中的Json字符串请求回来 * 3、把Json字符串解析成NewsData数据类型 * 4、在Adapter中的getView方法中  把NewsData中的标题和描述 先显示在控件 * 5、因为NewsData中还保存了每一个条目的  图片地址 * 6、getView方法中使用网络请求把每一个图片请求回来 * 7、图片回来后,使用OnUIThread方法把图片资源加载在ImageView控件上 * @author Administrator * */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{@Overridepublic int getCount() {// TODO Auto-generated method stubif(nb != null){return nb.getData().size();}return 0;}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn null;}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn 0;}@Overridepublic 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() {@Overridepublic 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();//因为该地址是一个图片的地址,所以返回的数据流就是一个图片的数据流//直接用该图片的数据流 转换成 一个Bitmapbit = BitmapFactory.decodeStream(inputStream);}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return bit;}        /**     * 使用Http请求把json请求回来     * 使用Gson把数据装换成NewsData类型     */private void initData() {new AsyncTask<String, String, String>(){@Overrideprotected String doInBackground(String... params) {//2、在initData方法中  使用HttpUrlConnetion把地址中的Json字符串请求回来String result = getData();return result;}@Overrideprotected void onPostExecute(String result) {//3、把Json字符串解析成NewsData数据类型Gson gson = new Gson();//然后把json数据使用Gson转换成NewsDatanb = gson.fromJson(result, NewsData.class);//4、在Adapter中的getView方法中  把NewsData中的标题和描述 先显示在控件//改变数据后 刷新adapteradapter.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 blocke.printStackTrace();}return result;}}

阅读全文
0 0