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, 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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值