zoukankan      html  css  js  c++  java
  • 全球疫情爬取及展示_app

    效果图:

     疫情数据爬取:https://www.cnblogs.com/XiaoGao128/p/12576648.html

    设计思路

    从服务器端请求数据,在客户端进行展示。客户端负责发送请求参数,服务端进行处理,访问数据库然后返回参数。

    客户端

    1、通过HttpUrlConnection的方式向服务器端发送请求,返回json数组,进行解析得到所需数据列表,通过调用下面这个工具类中的getList函数获取数据。

    public class JsonParse {
    
        /**
    
         * 解析Json数据
    
         *
    
         * @param urlPath
    
         * @return mlists
    
         * @throws Exception
    
         */
    
        public static List<ProvinceBean> getList(String urlPath) throws Exception {
    
            List<ProvinceBean> mlists = new ArrayList<ProvinceBean>();
    
            byte[] data = readParse(urlPath);
            Log.d("-------------------",data.toString());
            JSONArray array = new JSONArray(new String(data));
    
            for (int i = 0; i < array.length(); i++) {
    
                JSONObject item = array.getJSONObject(i);
                String state=item.getString("state");
                String name=item.getString("name");
                String confirm=item.getString("confirm");
                String current=item.getString("current");
                String suspect=item.getString("suspect");
                String cured=item.getString("cured");
                String dead=item.getString("dead");
                String date=item.getString("date");
                mlists.add(new ProvinceBean(state,name,confirm,current,suspect,cured,dead,date));
            }
    
            return mlists;
    
        }
    
        /**
    
         * 从指定的url中获取字节数组
    
         *
    
         * @param urlPath
    
         * @return 字节数组
    
         * @throws Exception
    
         */
    
        public static byte[] readParse(String urlPath) throws Exception {
    
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
    
            byte[] data = new byte[1024];
    
            int len = 0;
    
            URL url = new URL(urlPath);
    
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            Log.d("111",urlPath);
            conn.setRequestMethod("POST");
    //        conn.s
            InputStream inStream = conn.getInputStream();
            Log.d("222",urlPath);
            while ((len = inStream.read(data)) != -1) {
    
                outStream.write(data, 0, len);
    
            }
    
            inStream.close();
    
            return outStream.toByteArray();
    
        }
    }

     2、传递参数

      这里我设置了三个筛选按钮,分别注册contextmenu,用于筛选国际、国内的疫情并提供排序。默认显示当天的疫情数据,如需要,也可在一旁进行查询,如下图。

      菜单中每个按钮被点击之后都会重新请求数据并刷新图表,通过改变url后缀来附带参数。

      

     3、数据显示

      数据显示用了一个recycleview和MPAndroid图表。

      

    public class MainActivity extends AppCompatActivity {
        private RecyclerView recyclerView;
        private MainRecyAdapter adapter;
        private List<ProvinceBean> list = null;
        private PopupMenu pop_out, pop_in, pop_order;
        private Button btn_out, btn_in, btn_order, btn_query;
        private String nowout = "国际", nowin = "省份", noworder = "currentt";
        private boolean nowwhat = true;
        private EditText et_query;
        private boolean is_out = false, is_in = false, is_order = false;
        private ProgressBar progressBar;
        public ArrayList<BarEntry> entries ;
        public BarDataSet dataset;
        public ArrayList<String> labels;
        private BarChart barChart;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initViews();
            refreshList("http://123.56.137.134/CollectDataA/GiveData?posi=contury&date=alldate&order=" + noworder + "&state=allstate");
    
        }
    
        @Override
        protected void onResume() {
            super.onResume();
    
        }
    
        private void initViews() {
    //        barchart=findViewById(R.id.barchart);
    //        initChartAction();
            barChart=findViewById(R.id.barchart);
            progressBar=findViewById(R.id.main_prog);
            recyclerView = findViewById(R.id.main_recy);
            recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
            adapter = new MainRecyAdapter(list, MainActivity.this);
            recyclerView.setAdapter(adapter);
            btn_out = findViewById(R.id.main_expand_order_out);
            btn_in = findViewById(R.id.main_expand_order_in);
            btn_order = findViewById(R.id.main_expand_order_by);
            btn_out.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (!is_out) {
                        initPop_out();
                    } else {
                        pop_out.show();
                    }
                }
            });
            btn_in.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (!is_in) {
                        initPop_in();
                    } else {
                        pop_in.show();
                    }
                }
            });
            btn_order.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (!is_order){
                        initPop_order();
                    }else {
                        pop_order.show();
                    }
                }
            });
            et_query = findViewById(R.id.et_query);
            btn_query = findViewById(R.id.btn_query);
            btn_query.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String now;
                    if (nowwhat) {
                        now = "contury";
                    } else {
                        now = nowin;
                    }
                    String url = "http://123.56.137.134/CollectDataA/GiveData?posi=" + now + "&date=" + et_query.getText().toString() + "&order=" + noworder + "&state=allstate";
                    refreshList(url);
                }
            });
        }
    
        private void initPop_out() {
            is_out = true;
            pop_out = new PopupMenu(MainActivity.this, btn_out);
            pop_out.getMenuInflater().inflate(R.menu.menu_out, pop_out.getMenu());
            pop_out.show();
            pop_out.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    progressBar.setVisibility(View.VISIBLE);
    
                    nowwhat = true;
                    btn_out.setText(item.getTitle());
                    String url = "http://123.56.137.134/CollectDataA/GiveData?posi=contury&date=alldate&state=" + item.getTitle() + "&order=" + noworder;
                    refreshList(url);
                    return true;
                }
            });
        }
    
        private void initPop_order() {
            is_order = true;
            pop_order = new PopupMenu(MainActivity.this, btn_order);
            pop_order.getMenuInflater().inflate(R.menu.menu_order, pop_order.getMenu());
            pop_order.show();
            pop_order.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    progressBar.setVisibility(View.VISIBLE);
                    btn_order.setText(item.getTitle());
                    String url = "";
                    String now;
                    if (nowwhat) {
                        now = "contury";
                    } else {
                        now = nowin;
                    }
                    switch (item.getItemId()) {
                        case R.id.noww: {
                            url = "http://123.56.137.134/CollectDataA/GiveData?posi=" + now + "&date=alldate&order=currentt" + "&state=allstate";
                            noworder = "current";
                            break;
                        }
                        case R.id.confirmm: {
                            url = "http://123.56.137.134/CollectDataA/GiveData?posi=" + now + "&date=alldate&order=confirmm" + "&state=allstate";
                            noworder = "confirm";
                            break;
                        }
                        case R.id.curedd: {
                            url = "http://123.56.137.134/CollectDataA/GiveData?posi=" + now + "&date=alldate&order=cured" + "&state=allstate";
                            noworder = "cured";
                            break;
                        }
                        case R.id.deadd: {
                            url = "http://123.56.137.134/CollectDataA/GiveData?posi=" + now + "&date=alldate&order=dead" + "&state=allstate";
                            noworder = "dead";
                            break;
                        }
                    }
                    refreshList(url);
                    return true;
                }
            });
        }
    
        private void initPop_in() {
            is_in = true;
            pop_in = new PopupMenu(MainActivity.this, btn_in);
            pop_in.getMenuInflater().inflate(R.menu.menu_in, pop_in.getMenu());
            pop_in.show();
    
            pop_in.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    progressBar.setVisibility(View.VISIBLE);
    
                    nowwhat = false;
                    btn_in.setText(item.getTitle());
                    btn_in.setText(item.getTitle());
                    if (item.getItemId()==R.id.province) {
                        String url = "http://123.56.137.134/CollectDataA/GiveData?posi=province&date=alldate&order=" + noworder + "&state=allstate";
                        nowin = "province";
                        refreshList(url);
                    } else {
                        String url = "http://123.56.137.134/CollectDataA/GiveData?posi=city&date=alldate&order=" + noworder + "&state=allstate";
                        nowin = "city";
                        refreshList(url);
                    }
                    return true;
                }
            });
    
        }
        private void refreshList(String url) {
            //获取数据
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        list = JsonParse.getList(url);
                        Message message = new Message();
                        message.what = 1;
                        Log.d("----------",url);
                        handler.sendMessage(message);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    
        private Handler handler = new Handler() {
            @Override
            public void handleMessage(@NonNull Message msg) {
                super.handleMessage(msg);
                if (msg.what == 1) {
                    Log.d("---------","1");
                    recyclerView.setAdapter(new MainRecyAdapter(list, MainActivity.this));
                    progressBar.setVisibility(View.INVISIBLE);
    
                    initEntriesData();
                    show();
                }
            }
        };
    
        private void initEntriesData() {
            entries=new ArrayList<>();
    
            for (int i=0;i<list.size();i++){
                if (i>=100) break;
                switch (noworder){
                    case "currentt":{
                        entries.add(new BarEntry(i,Float.parseFloat(list.get(i).getCurrent())));
                        break;
                    }
                    case "confirmm":{
                        entries.add(new BarEntry(i,Float.parseFloat(list.get(i).getConfirm())));
                        break;
                    }
                    case "cured":{
                        entries.add(new BarEntry(i,Float.parseFloat(list.get(i).getCured())));
                        break;
                    }
                    case "dead":{
                        entries.add(new BarEntry(i,Float.parseFloat(list.get(i).getDead()),i));
                        break;
                    }
    
                }
            }
    
        }
        public void show() {
            dataset = new BarDataSet(entries, "# of Calls");
            dataset.setColors(ColorTemplate.COLORFUL_COLORS);
            BarData data = new BarData(dataset);
            barChart.setData(data);
    //      chart.animateXY(5000,5000);
    //      chart.animateX(5000);
    //        initLableData();
    //        barChart.setBackgroundColor(Color.WHITE);
    //        barChart.set
            barChart.animateY(2000);
            barChart.setTouchEnabled(true); // 设置是否可以触摸
            barChart.setDragEnabled(true);// 是否可以拖拽
            barChart.setScaleEnabled(true);// 是否可以缩放
            barChart.setPinchZoom(true);//y轴的值是否跟随图表变换缩放;如果禁止,y轴的值会跟随图表变换缩放
            barChart.setDrawGridBackground(true);// 是否显示表格颜色
            barChart.setGridBackgroundColor(Color.TRANSPARENT);// 表格的的颜色
            barChart.animateY(1000, Easing.Linear);//设置动画
            barChart.setExtraBottomOffset(5f);//防止底部数据显示不完整,设置底部偏移量
            XAxis xAxis = barChart.getXAxis();
            xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
            xAxis.setTextSize(10f);
            xAxis.setTextColor(Color.RED);
            xAxis.setDrawAxisLine(true);
            xAxis.setDrawGridLines(false);
            // 设置定制的数据格式
            ValueFormatter formatter = new ValueFormatter() {
    //            @Override
    //            public String getFormattedValue(float value, AxisBase axis) {
    //
    //            }
    
                @Override
                public String getFormattedValue(float value) {
                    Log.d("TAG", "--------->getFormattedValue: " + value);
                    //设置 xAxis.setGranularity(1);后 value是从0开始的,每次加1,
                    int v = (int) value;
                    if (v <= list.size()&&v<=100&& v >= 0) {
                        String st = list.get(v).getName();
                        String tim1 = "";
                        tim1 = st;
                        return tim1;
                    } else {
                        return null;
                    }
                }
            };
            xAxis.setValueFormatter(formatter);
        }
    }
    

      

  • 相关阅读:
    JVM学习笔记之认识JDK(一)
    C#发送邮件异常:根据验证过程,远程证书无效
    windows下使用mysql双机热备功能
    批处理实现mysql的备份
    WebApi FormData+文件长传 异步+同步实现
    Oracle中已知字段名查询所在的表名
    mstsc遇到CredSSP加密Oracle修正
    使用subgit进行svn迁移至git(branch,tags)
    使用guava进行对字符串的加锁
    使用spring-data-solr做solr客户端
  • 原文地址:https://www.cnblogs.com/XiaoGao128/p/12582698.html
Copyright © 2011-2022 走看看