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;    }}
原创粉丝点击