Android开发图片相关知识解析,用到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, Mapparams, String encoding) throws IOException { String result=""; List pairs=new ArrayList (); if(pairs!=null) { for(Map.Entry 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 NewsAdapter
public class NewsAdapter extends BaseAdapter implements AbsListView.OnScrollListener { private ListmList; private LayoutInflater mInflater; private ImageLoader imageLoader; private int mStart,mEnd; public static String[] URLS;//保存所有图片URl地址 private boolean mFirstIn; public NewsAdapter(Context context, List ImageLoader
public class ImageLoader { private ImageView mImageView; private String mUrl; //创建cache private LruCachemCaches; private ListView mListView; private Set mTask; public ImageLoader(ListView listview) { mListView=listview; mTask=new HashSet (); //获取最大可用内存 int maxMemory=(int) Runtime.getRuntime().maxMemory(); int cacheSize=maxMemory/4; mCaches = new LruCache (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 { // 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