一个简单地综合运用.从网络获取资源.

来源:互联网 发布:中国it系统集成商排名 编辑:程序博客网 时间:2024/06/05 05:38

package cn.itcast.youku.util;import java.io.ByteArrayOutputStream;import java.io.InputStream;public class StreamTool {/** * 把一个inputstream里面的内容转化成一个byte[]  *一般是用在图片或者xml源文件. */public static byte[] getBytes(InputStream is) throws Exception{// 可以捕获内存缓冲区的数据,转换成字节数组。//字节数组流:ByteArrayOutputStream bos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while((len = is.read(buffer))!=-1){bos.write(buffer, 0, len);}is.close();bos.flush();//获取内存缓冲中的数据byte[] result = bos.toByteArray();System.out.println(new String(result));return  result;}}

//最近有个bug,找了2天都找不到.一直不知道怎么回事.觉得一点都没有错,但是程序就是出问题.从网络上下载不下图片.

//因为没有log习惯和sys习惯.用junit测试可以通过.

//最后发现时一个非常低级的错误.在服务器,更改代码后,竟然没有保存修改的数据.

//主activity和获取图片代码

//从网络 获取资源    从地址得到输入流  .由输入流得到byte数组 ,得到字符串或者图片.

//                              从地址得到输入流  .由输入流直接得到者图片.

//                               从地址得到输入流  .由输入流直接得到者数组集合.用xml解析.


package cn.itcast.youku;import java.io.File;import java.io.InputStream;import java.util.List;import cn.itcast.youku.domain.Channel;import cn.itcast.youku.service.ChannelxmlService;import cn.itcast.youku.service.ImageUtil;import cn.itcast.youku.service.NetUtil;import android.app.Activity;import android.graphics.Bitmap;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;public class DemoActivity extends Activity {private ListView lv;private List<Channel> channels;private LayoutInflater inflater;private String tag="DemoActivity";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);// inflater = (LayoutInflater)// getSystemService(LAYOUT_INFLATER_SERVICE);inflater = LayoutInflater.from(this);lv = (ListView) this.findViewById(R.id.lv);//先得到地址address.从资源文件得到.String address = getResources().getString(R.string.serverurl);try {//两部分   第一有地址得到输入流.  InputStream is = NetUtil.getChannelStream(address);//channels是所有的数据.它里面放的是一个个channel.  //第二从输入流中解析 得到数据集合.channels = ChannelxmlService.getChannels(is);} catch (Exception e) {Toast.makeText(this, "获取数据失败", 0).show();e.printStackTrace();}// 填充listview的数据lv.setAdapter(new MyAdapter());lv.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {Channel chanel = (Channel) lv.getItemAtPosition(position);String channelid = chanel.getId();Toast.makeText(DemoActivity.this, "提交 "+channelid+"到服务器", 0).show();}});}private class MyAdapter extends BaseAdapter {@Overridepublic int getCount() {// TODO Auto-generated method stubreturn channels.size();}//首先我们需要把所有的信息都获取出来.需要一个类从网络上获取数据后,封装到listview中.@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn channels.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {//得到子view控件.View view = inflater.inflate(R.layout.item, null);//得到每一个channel.//是为了向控件中放数据.Channel channel = channels.get(position);        //图片      ImageView iv_item = (ImageView) view.findViewById(R.id.iv_item);//点播次数TextView tv_count = (TextView) view.findViewById(R.id.tv_count);//标题TextView tv_name = (TextView) view.findViewById(R.id.tv_name);//具体时间TextView tv_time = (TextView) view.findViewById(R.id.tv_time);//次数tv_count.setText("点播次数 " + channel.getCount());//标题tv_name.setText(channel.getName());//点播时间tv_time.setText("播放时间 " + channel.getTime());//图片的地址.String pic_address = channel.getIcon();System.out.println(pic_address);//得到索引.//int start = pic_address.lastIndexOf("/");////a.jpg   b.jpg.//String iconname = pic_address.substring(start + 1, pic_address.length());////在sd卡打开文件//File file = new File(Environment.getExternalStorageDirectory(),//iconname);//if (file.exists()) {//// 如果存在 就直接使用 sd卡的文件////Uri.fromFile(file)得到文件的uri.//iv_item.setImageURI(Uri.fromFile(file));//System.out.println("使用缓存");//} else {//// 如果不存在 才去下载网络上的图片Log.i(tag, ".......");try {Bitmap bitmap = ImageUtil.getImage(pic_address);iv_item.setImageBitmap(bitmap);System.out.println("下载新的图片");} catch (Exception e) {e.printStackTrace();//iv_item.setImageResource(R.drawable.default_icon);}//}return view;}}}
package cn.itcast.youku.service;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import cn.itcast.youku.util.StreamTool;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Environment;public class ImageUtil {/** * 由地址 http://xxx.xxx/a.jpg获取获取网络address地址对应的图片 * 1.把图片 *  * @param address * @return bitmap的类型  */public static Bitmap getImage(String pic_address) throws Exception{//通过代码 模拟器浏览器访问图片的流程 // http://xxx.xxx/a.jpg//int start = pic_address.lastIndexOf("/");////a.jpg//String iconname = pic_address.substring(start+1, pic_address.length());//System.out.println(iconname);////创建文件a.jpg//File file = new File(Environment.getExternalStorageDirectory(),iconname);//System.out.println(file);////创建输出流//FileOutputStream fos = new FileOutputStream(file);URL pic_url = new URL(pic_address);HttpURLConnection pic_conn =  (HttpURLConnection) pic_url.openConnection();pic_conn.setRequestMethod("GET");pic_conn.setConnectTimeout(5000);//获取服务器返回回来的流输入流InputStream pic_is = pic_conn.getInputStream();//result是byte数组.byte[] result = StreamTool.getBytes(pic_is);//这点非常重要.把图片信息 保存到sd卡//fos.write(result);//fos.flush();//fos.close();Bitmap bitmap = BitmapFactory.decodeByteArray(result, 0, result.length);return bitmap;}}
package cn.itcast.youku.service;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import org.xmlpull.v1.XmlPullParser;import android.util.Xml;import cn.itcast.youku.domain.Channel;public class ChannelxmlService {//由输入流的信息解析后, 得到list集合.public static List<Channel> getChannels (InputStream is ) throws Exception{XmlPullParser parser = Xml.newPullParser();parser.setInput(is, "utf-8");List<Channel> channels = new ArrayList<Channel>();    int type =parser.getEventType();Channel channel = null;while(type!=XmlPullParser.END_DOCUMENT){switch (type) {case XmlPullParser.START_TAG:if("channel".equals(parser.getName())){channel = new Channel();String id = parser.getAttributeValue(0);channel.setId(id);}else if("name".equals(parser.getName())){String name = parser.nextText();channel.setName(name);}else if("time".equals(parser.getName())){String time = parser.nextText();channel.setTime(time);}else if("count".equals(parser.getName())){String count = parser.nextText();channel.setCount(Integer.parseInt( count));}else if("icon".equals(parser.getName())){String icon = parser.nextText();channel.setIcon(icon);}break;case XmlPullParser.END_TAG:if("channel".equals(parser.getName())){channels.add(channel);channel = null;}break;}type = parser.next();}return channels;}}
<pre class="java" name="code">package cn.itcast.youku.util;import java.io.ByteArrayOutputStream;import java.io.InputStream;public class StreamTool {/** * 把一个inputstream里面的内容转化成一个byte[]  *一般是用在图片或者xml源文件. */public static byte[] getBytes(InputStream is) throws Exception{ByteArrayOutputStream bos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while((len = is.read(buffer))!=-1){bos.write(buffer, 0, len);}is.close();bos.flush();byte[] result = bos.toByteArray();System.out.println(new String(result));return  result;}}





0 0