xlistView与本地缓存加载

public class MainActivity extends AppCompatActivity implements XListView.IXListViewListener {

    private XListView mlistView;
    //因为参数是可变的所以起一个变量
    private int startNum=0;

    private String path="http://www.93.gov.cn/93app/data.do?channelId=0&startNum=0";
    private Handler mHandler=new Handler(){
            @Override
            public void   handleMessage(Message msg) {
               String url =msg.obj.toString();
                Gson gson=new Gson();
                Data data = gson.fromJson(url, Data.class);

                mlist.addAll(data.getData());
                myAdapter.notifyDataSetChanged();
                //停止更新的操作
                StopXlist();

            }

        private void StopXlist() {
            mlistView.stopLoadMore();
            mlistView.stopRefresh();
            mlistView.setRefreshTime("刚刚");
        }
    };
    private List<Data.DataBean> mlist;
    private MyAdapter myAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mlistView = (XListView) findViewById(R.id.listview);
        mlist = new ArrayList<>();
        myAdapter = new MyAdapter(MainActivity.this,mlist);
        mlistView.setAdapter(myAdapter);
        //开启加载更多
        mlistView.setPullLoadEnable(true);
        mlistView.setXListViewListener(this);

        loadData();
    }

    private void loadData() {
        File file=new File(getExternalCacheDir(),NetUtils.getMD5(path+startNum));
        if(file.exists()){
            Toast.makeText(MainActivity.this,"从本地获取",Toast.LENGTH_SHORT).show();
            try {
                BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(file)));
                StringBuffer sb=new StringBuffer();
                String line="";
                while((line=br.readLine())!=null){
                    sb.append(line);
                }
                br.close();
                Message msg= Message.obtain();
                msg.what=0;
                msg.obj=sb.toString();
                mHandler.sendMessage(msg);
            } catch (Exception e) {
                e.printStackTrace();
            }

        }else{
            Toast.makeText(MainActivity.this,"从网络获取",Toast.LENGTH_SHORT).show();
            new Thread(){
            @Override
            public void run() {
                String result =NetUtils.getUrlConnect(MainActivity.this,path+startNum);
                if (result!=null){
                    Message msg= Message.obtain();
                    msg.what=0;
                    msg.obj=result;
                    mHandler.sendMessage(msg);
                }
            }
        }.start();

        }

    }

    @Override
    public void onRefresh() {
            startNum=0;
            //清空数据
            mlist.clear();
            loadData();
    }

    @Override
    public void onLoadMore() {
        startNum=mlist.size();
        loadData();
    }
}
public class NetUtils {
     public static String postUrlConnect(String urlPath, Map<String,Object> map){
                      StringBuffer sbRequest =new StringBuffer();
                       if(map!=null&&map.size()>0){
                           for (String key:map.keySet()){
                               sbRequest.append(key+"="+map.get(key)+"&");
                           }
                       }
                       String request = sbRequest.substring(0,sbRequest.length()-1);
                       try {
                           //创建URL
                           URL url = new URL(urlPath);
                           //由URL的openConnection方法得到一个HttpURLConnection(需要强转)
                           HttpURLConnection httpURLConnection =
                                   (HttpURLConnection) url.openConnection();
                           //设置post提交
                           httpURLConnection.setRequestMethod("POST");
                           //设置超时时间
                           httpURLConnection.setConnectTimeout(30000);
                           httpURLConnection.setReadTimeout(30000);

                           httpURLConnection.setDoInput(true);
                           httpURLConnection.setDoOutput(true);

                           //把请求正文通过OutputStream发出去
                           OutputStream os =httpURLConnection.getOutputStream();
                           os.write(request.getBytes());
                           os.flush();

                           //判断响应码  200 代表成功
                           if(httpURLConnection.getResponseCode()==200){
                               //由HttpURLConnection拿到输入流
                               InputStream in=httpURLConnection.getInputStream();
                               StringBuffer sb=new StringBuffer();

                               //根据输入流做一些IO操作
                               byte [] buff =new byte[1024];
                               int len=-1;
                               while((len=in.read(buff))!=-1){
                                   sb.append(new String(buff,0,len,"utf-8"));
                               }

                               in.close();
                               os.close();
                               httpURLConnection.disconnect();
                               return  sb.toString();
                           }else{
                               return null;
                           }

                       }catch (Exception e){
                           Log.e("post","code:"+e.getMessage());
                           return null;
                       }
                   }

                   /**
                    * HttpURLConnection的get请求
                    * @param urlPath
                    * @return
                    */
                   public static String getUrlConnect(Context context,String urlPath){

                       try {
                           //创建URL
                           URL url = new URL(urlPath);
                           //由URL的openConnection方法得到一个HttpURLConnection(需要强转)
                           HttpURLConnection httpURLConnection =
                                   (HttpURLConnection) url.openConnection();
                           //设置连接
                           httpURLConnection.connect();
                           //判断响应码  200 代表成功
                           if(httpURLConnection.getResponseCode()==200){
                               //由HttpURLConnection拿到输入流
                               InputStream in=httpURLConnection.getInputStream();
                               StringBuffer sb=new StringBuffer();

//                                网络缓存本地的保存文件
                               File file=new File(context.getExternalCacheDir(),getMD5(urlPath));
                               FileOutputStream fos=new FileOutputStream(file);
                               //根据输入流做一些IO操作
                               byte [] buff =new byte[1024];
                               int len=-1;
                               while((len=in.read(buff))!=-1){
                                   fos.write(buff,0,len);
                                   sb.append(new String(buff,0,len,"utf-8"));
                               }


                               fos.flush();
                               fos.close();
                               in.close();

                               httpURLConnection.disconnect();
                               return  sb.toString();
                           }else{
                               return null;
                           }
                       } catch (Exception e) {
                           e.printStackTrace();
                       }
                       return null;
                   }


 /**
     * 对字符串md5加密
     *
     * @param str
     * @return
     */
    public static String getMD5(String str) {
        try {
            // 生成一个MD5加密计算摘要
            MessageDigest md = MessageDigest.getInstance("MD5");
            // 计算md5函数
            md.update(str.getBytes());
            // digest()最后确定返回md5 hash值,返回值为8为字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
            // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值
            return new BigInteger(1, md.digest()).toString(16);
        } catch (Exception e) {
            return str ;
        }
    }
}
public class MyAdapter extends BaseAdapter{

        Context context;
        List<Data.DataBean> mlist;
        public MyAdapter(Context context, List<Data.DataBean> mlist) {
            this.mlist=mlist;
            this.context=context;
        }

        @Override
        public int getCount() {
            return mlist.size();
        }

        @Override
        public Object getItem(int position) {
            return mlist.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
           ViewHolder holder;
            if (convertView==null){
                convertView=View.inflate(context,R.layout.item,null);
                holder =new ViewHolder();
                holder.image= (ImageView) convertView.findViewById(R.id.imageView);
                holder.textView01= (TextView) convertView.findViewById(R.id.text1);
                holder.textView02= (TextView) convertView.findViewById(R.id.text2);
                convertView.setTag(holder);
            }
            else {
               holder= (ViewHolder) convertView.getTag();
            }
              Data.DataBean bean=mlist.get(position);
              holder.textView01.setText(bean.getTITLE());
              holder.textView02.setText(bean.getSHOWTIME());
            Glide.with(context).load(bean.getIMAGEURL()).into(holder.image);

            return convertView;
        }
        class  ViewHolder{
            ImageView image;
            TextView textView01,textView02;
        }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值