Android图片解析
来源:互联网 发布:ipad版淘宝不支持横屏 编辑:程序博客网 时间:2024/06/06 09:26
用到5个类 向服务器发请求获取图片JSON加载解析到ListView里显示
Util获取Json
NewsAdapter作为listview适配器
ImageLoader 这个类神奇了 具体功能看代码吧.. 几句话说不完
SelectPictureHandler解析Json (多线程)
PictureActivity 综合内容 进行显示
用到了cache缓存,从Url读取图片信息,再异步加载出来
理解多线程的概念,我在实际操作的时候一个大棚id死活传不进去,后来是忘记了构造函数里有
注:代码有很强的环境特性,用的话需要修改较多
Util类
public class Util { //读取流中的数据 public static byte[] getByte(InputStream is)throws Exception { ByteArrayOutputStream output=new ByteArrayOutputStream(); byte[] buff=new byte[1024]; int len=0; while((len=is.read(buff))!=-1) { output.write(buff, 0, len); } return output.toByteArray(); } //发送post请求并接受返回信息 public static String sendPostRequest(String path, Map<String,String> params, String encoding) throws IOException { String result=""; List<NameValuePair> pairs=new ArrayList<NameValuePair>(); if(pairs!=null) { for(Map.Entry<String,String>entry:params.entrySet()){ pairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); } } UrlEncodedFormEntity entity=new UrlEncodedFormEntity(pairs,encoding); HttpPost post=new HttpPost(path); post.setEntity(entity); DefaultHttpClient client=new DefaultHttpClient(); HttpResponse response=client.execute(post); if(response.getStatusLine().getStatusCode()==200){ result= EntityUtils.toString(response.getEntity()); //获得response数据 } System.out.println(result+"返回信息"); return result; } private void parseJson(InputStream instream) throws Exception { byte[]data=Util.getByte(instream); String json=new String(data); System.out.print(json+"json"); if(json.equals("fail")){ }else{ System.out.println(json+"返回信息"); JSONArray array=new JSONArray(json); for(int i=0;i<array.length();i++){ JSONObject jobject=array.getJSONObject(i); jobject.getString("uname"); } } }}
NewsAdapter
public class NewsAdapter extends BaseAdapter implements AbsListView.OnScrollListener { private List<vo.Picture> mList; private LayoutInflater mInflater; private ImageLoader imageLoader; private int mStart,mEnd; public static String[] URLS;//保存所有图片URl地址 private boolean mFirstIn; public NewsAdapter(Context context, List<Picture> mList, ListView listview) { super(); this.mList = mList; mInflater =LayoutInflater.from(context); imageLoader=new ImageLoader(listview); URLS=new String[mList.size()]; for(int i=0;i<mList.size();i++){ URLS[i]=mList.get(i).getName(); } mFirstIn=true; listview.setOnScrollListener(this); } @Override public int getCount() { // TODO 自动生成的方法存根 return mList.size(); } @Override public Object getItem(int position) { // TODO 自动生成的方法存根 return mList.get(position); } @Override public long getItemId(int position) { // TODO 自动生成的方法存根 return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO 自动生成的方法存根 ViewHolder viewHolder=null; if(convertView==null) { viewHolder=new ViewHolder(); convertView=mInflater.inflate(R.layout.activity_picture,null); viewHolder.ivcon=(ImageView) convertView.findViewById(R.id.pic_iv); viewHolder.tvContent=(TextView) convertView.findViewById(R.id.pic_tv); convertView.setTag(viewHolder); } else{ viewHolder=(ViewHolder) convertView.getTag(); } viewHolder.ivcon.setImageResource(R.drawable.ic_launcher); String url=mList.get(position).getName(); StringBuilder sb=new StringBuilder(url.substring(url.lastIndexOf("/")+1,url.lastIndexOf("/")+15)); sb.insert(4,'-'); sb.insert(7,'-'); sb.insert(10,' '); sb.insert(13,':'); sb.insert(16,':'); //new ImageLoader().showImageByThread(viewHolder.ivcon,url); viewHolder.ivcon.setTag(url); imageLoader.showImageByAsyncTask(viewHolder.ivcon,url); viewHolder.tvContent.setText(sb.toString()); return convertView; } class ViewHolder{ public TextView tvContent; public ImageView ivcon; } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if(scrollState==SCROLL_STATE_IDLE){ //加载可见项 imageLoader.loadImage(mStart, mEnd); }else{ //停止任务 imageLoader.cancelAllTAsks(); } } @Override public void onScroll(AbsListView view, int firstVisibleItem,//第一个可见元素 int visibleItemCount//可见元素长度 , int totalItemCount) { mStart=firstVisibleItem; mEnd=firstVisibleItem+visibleItemCount; //首次加载启动项 if(mFirstIn && visibleItemCount>0){ imageLoader.loadImage(mStart,mEnd); mFirstIn=false; } }}
ImageLoader
public class ImageLoader { private ImageView mImageView; private String mUrl; //创建cache private LruCache<String,Bitmap> mCaches; private ListView mListView; private Set<NewsAsyncTask> mTask; public ImageLoader(ListView listview) { mListView=listview; mTask=new HashSet<NewsAsyncTask>(); //获取最大可用内存 int maxMemory=(int) Runtime.getRuntime().maxMemory(); int cacheSize=maxMemory/4; mCaches = new LruCache<String, Bitmap>(cacheSize){ @SuppressLint("NewApi") @Override protected int sizeOf(String key, Bitmap value) { //在每次存入的缓存是调用 return value.getByteCount(); } }; } //将内容保存到Cache中 public void addBitmapToCache(String url,Bitmap bitmap){ //缓存中没有内容,则保存到缓存中 if(getBitmapFromCache(url)==null){ mCaches.put(url,bitmap); } } //从Cache中获取内容 public Bitmap getBitmapFromCache(String url){ return mCaches.get(url); } private Handler mhandler=new Handler(){ @Override public void handleMessage(Message msg) { // TODO 自动生成的方法存根 super.handleMessage(msg); if(mImageView.getTag().equals(mUrl)) mImageView.setImageBitmap((Bitmap)msg.obj); } }; public void showImageByThread(ImageView imageView,final String url){ mImageView=imageView; mUrl=url; new Thread(){ @Override public void run() { // TODO 自动生成的方法存根 super.run(); Bitmap bitmap=getBitmapFromUrl(url); Message message=Message.obtain(); message.obj=bitmap; mhandler.sendMessage(message); } }.start(); } public Bitmap getBitmapFromUrl(String urlString){ Bitmap bitmap; InputStream is = null; try { URL url=new URL(urlString); HttpURLConnection connection=(HttpURLConnection) url.openConnection(); is=new BufferedInputStream(connection.getInputStream()); BitmapFactory.Options options=new BitmapFactory.Options(); options.inSampleSize = 2; bitmap=BitmapFactory.decodeStream(is,null,options); connection.disconnect(); return bitmap; } catch (MalformedURLException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } finally{ try { is.close(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } return null; } public void showImageByAsyncTask(ImageView imagview,String url){ //先从缓存中取出对应的图片 Bitmap bitmap=getBitmapFromCache(url); //如果缓存中没有,则必须从网络中下载 if(bitmap==null){ //new NewsAsyncTask(imagview,url).execute(url); imagview.setImageResource(R.drawable.ic_launcher); } else{ imagview.setImageBitmap(bitmap); } } //取消加载任务 public void cancelAllTAsks(){ if(mTask!=null){ for(NewsAsyncTask task:mTask){ task.cancel(false); } } } //用于加载从start到end的图片 public void loadImage(int start,int end){ for(int i=start;i<end;i++){ String url=NewsAdapter.URLS[i]; //先从缓存中取出对应的图片 Bitmap bitmap=getBitmapFromCache(url); //如果缓存中没有,则必须从网络中下载 if(bitmap==null){ NewsAsyncTask task=new NewsAsyncTask(url); task.execute(url); mTask.add(task); }else{ ImageView imageView=(ImageView) mListView.findViewWithTag(url); imageView.setImageBitmap(bitmap); } } } private class NewsAsyncTask extends AsyncTask<String,Void, Bitmap> { // public ImageView mimageview; private String mUrl; public NewsAsyncTask(String murl) { super(); //this.mimageview = mimageview; this.mUrl = murl; } @Override protected Bitmap doInBackground(String... params) { String url=params[0]; //从网络获取图片 Bitmap bitmap=getBitmapFromUrl(url); if(bitmap!=null){ //将不在缓存的图片加入缓存 addBitmapToCache(url, bitmap); } return bitmap; } @Override protected void onPostExecute(Bitmap result) { super.onPostExecute(result);// if(mimageview.getTag().equals(murl))// mimageview.setImageBitmap(result); ImageView imageView=(ImageView) mListView.findViewWithTag(mUrl); if(imageView!=null && result!=null){ imageView.setImageBitmap(result); } mTask.remove(this); } }}
SelectPictureHanlder
public class SelectPictureHanlder implements Runnable { private Handler handler; private String flag; private String id; public ArrayList<Picture> piclist = new ArrayList<Picture>(); public SelectPictureHanlder(Handler handler,String flag,String id) { super(); this.handler = handler; this.flag=flag; this.id = id ; } @Override public void run() { // TODO Auto-generated method stub String result; Map<String, String> params=new HashMap<String, String>(); params.put("flag", flag); try { result=Util.sendPostRequest(Info.path10+id, params, "UTF-8"); if(result.equals("暂无数据")){ handler.sendEmptyMessage(0); } else{ parseJson(result); } } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void parseJson(String instream) throws JSONException { // TODO Auto-generated method stub if(instream.equals("fail")) { handler.sendEmptyMessage(0); } else{ JSONArray array=new JSONArray(instream); System.out.println(array.length()+"----->"); System.out.println("JSonArray.length"+array.length()+""); for(int i=0;i<array.length();i++){ JSONObject rs=array.getJSONObject(i); Picture lc=new Picture(rs.getString("name")); piclist.add(lc); } handler.sendEmptyMessage(1); } }}
PictureActivity
public class PictureActivity extends Activity { private Intent a; private ImageView imgView; private ImageView imgView2; private String dapengid; private Button btn_next; private Handler pic_hdl,handler; private ListView listview; private ArrayList<Picture> piclist; private ProgressDialog mDialog;// private FragmentManager manager;// private FragmentTransaction transaction; final String Path="保密" ; private SelectPictureHanlder selectPictureHanlder; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.picture); imgView=(ImageView) findViewById(R.id.imgv); imgView2=(ImageView) findViewById(R.id.imgv2); listview=(ListView)findViewById(R.id.piclist); a = getIntent(); dapengid = a.getStringExtra("id");// manager = getFragmentManager();// transaction = manager.beginTransaction();// final PictureFragment pictureFragment = new PictureFragment(); handler=new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub switch (msg.what) { case 0: Toast.makeText(PictureActivity.this, "查询请求失败",Toast.LENGTH_LONG).show(); break; case 1: for(int i=0;i<selectPictureHanlder.piclist.size();i++) { if(!selectPictureHanlder.piclist.get(i).getName().startsWith("http")){ selectPictureHanlder.piclist.get(i).setName(PictureActivity.this.Path+"dzlx"+dapengid+"/"+selectPictureHanlder.piclist.get(i).getName()); } } Toast.makeText(PictureActivity.this, "查询成功",Toast.LENGTH_LONG).show(); if(selectPictureHanlder.piclist.size()>0){ NewsAdapter adapter=new NewsAdapter(PictureActivity.this,selectPictureHanlder.piclist,listview); listview.setAdapter(adapter); /* listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // TODO 自动生成的方法存根 ImageView imageview=(ImageView) view.findViewById(R.id.image_p); imageview.buildDrawingCache(); Bitmap bmap = imageview.getDrawingCache(); onThumbnailClick(bmap); } });*/ } break; default: break; } } }; selectPictureHanlder =new SelectPictureHanlder(handler,"1",dapengid); new Thread(selectPictureHanlder).start(); System.out.println("查询线程已启动"); } public void onThumbnailClick(Bitmap bmap) {// final AlertDialog dialog = new AlertDialog.Builder(getActivity()).create();// ImageView imgView = getImageView(bmap);// dialog.setView(imgView);// dialog.show(); // 全屏显示的方法 final Dialog dialog = new Dialog(PictureActivity.this, android.R.style.Theme_Black_NoTitleBar_Fullscreen); ImageView imgView = getImageView(bmap); dialog.setContentView(imgView); dialog.show(); // 点击图片消失 imgView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub dialog.dismiss(); } }); } private ImageView getImageView(Bitmap bmap) { ImageView imgView = new ImageView(PictureActivity.this); imgView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); imgView.setImageBitmap(bmap); return imgView; } private class ViewHolder{ private ImageView mimageview; private TextView textView; } public Bitmap getUrlImage(String url) { Bitmap img = null; try { URL picurl = new URL(url); HttpURLConnection conn = (HttpURLConnection)picurl.openConnection(); conn.setConnectTimeout(6000); conn.setDoInput(true); conn.setUseCaches(false); conn.connect(); InputStream is = conn.getInputStream(); try{ is = conn.getInputStream(); BitmapFactory.Options options=new BitmapFactory.Options(); options.inSampleSize = 4; img = BitmapFactory.decodeStream(is,null,options); } catch(Exception e) { Toast.makeText(PictureActivity.this, "加载图片过大,请稍后重试",Toast.LENGTH_LONG).show(); } is.close(); } catch (Exception e) { e.printStackTrace(); } return img; } public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode==KeyEvent.KEYCODE_HOME) finish(); if(keyCode==KeyEvent.KEYCODE_BACK){// Intent intent=new Intent(PictureActivity.this,MainActivity.class );//// startActivity(intent); finish(); } return false; }}
阅读全文
0 0
- Android 解析二维码图片
- Android 解析二维码图片
- Android图片解析
- android skia 解析gif图片
- android ImageView解析网络图片
- android .9.png 图片解析
- Android截屏及图片解析
- 解决Android解析图片的OOM问题!!!
- 解决Android解析图片的OOM问题!!!
- 解决Android解析图片的OOM问题!!!
- 解决Android解析图片的OOM问题!!!
- 解决Android解析图片的OOM问题!!!
- 解决Android解析图片的OOM问题!!!
- 解决Android解析图片的OOM问题!!!
- 解决Android解析图片的OOM问题!!!
- 解决Android解析图片的OOM问题
- 解决Android解析图片的OOM问题
- 解决Android解析图片的OOM问题
- 后端_第十课_用AJAX与网页交互
- 20171207一元二次方程
- 数据结构实验之图论七:驴友计划
- HashMap和Hashtable的区别
- 11.数据结构(4)
- Android图片解析
- SQL 经典五十道题
- Oracle数据库初学者
- ConcurrentHashMap源码解析
- 多线程2_补充_小记
- bootstrap
- AsyncTask源码解析
- 2140 数据结构实验之图论十:判断给定图是否存在合法拓扑序列
- 【PHP自学笔记】第十五章 Smarty模板