使用Android显示疫情信息
问题描述
问题分析
把数据通过服务器端发布,后由移动端接收数据并显示。
源码
python爬虫部分
1 # author: pjh time: 2020/3/18 2 # coding=utf-8 3 import pymysql 4 import requests 5 import json 6 7 url = "https://c.m.163.com/ug/api/wuhan/app/data/list-total?t=316765403234" 8 header = {"user-agent": "Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (" 9 "KHTML, like Gecko) Chrome/80.0.3987.116 Mobile Safari/537.36"} 10 response = requests.get(url, headers=header) 11 mydir = json.loads(response.content.decode()) 12 # 数据库的连接 13 db = pymysql.connect(host='localhost', port=3306, user='root', passwd='123456', db='yiqing', charset='utf8') 14 # 使用cursor方法创建一个游标 15 cursor = db.cursor() 16 for item in mydir['data']['areaTree']: 17 name = item['name'] 18 confirm = item['total']['confirm'] 19 severe = item['total']['severe'] 20 heal = item['total']['heal'] 21 dead = item['total']['dead'] 22 suspect = item['total']['suspect'] 23 idcode = item['id'] 24 lastUpdateTime = item['lastUpdateTime'] 25 # 插入数据 26 # sql = "insert into global(id,name,confirm,suspect,heal,dead,severe,idcode,lastupdatetime) values ({},'{}'," \ 27 # "'{}','{}','{}','{}','{}','{}','{}');".format( 28 # 0, name, confirm, suspect, heal, dead, severe, idcode, lastUpdateTime) 29 30 # 更新数据 31 sql = "update global set name='{}' confirm='{}',suspect='{}',heal='{}',dead='{}',severe='{}',lastupdatetime='{}'" \ 32 " where idcode='{}'".format(name, confirm, suspect, heal, dead, severe, lastUpdateTime, idcode) 33 print(sql) 34 cursor.execute(sql) 35 db.commit()
服务器端发布的servlet部分
1 package com.pjh.servlet; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.annotation.WebServlet; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 12 import com.pjh.DBUtils.DBUtils; 13 14 /** 15 * Servlet implementation class sendDataServlet 16 */ 17 @WebServlet("/sendDataServlet") 18 public class sendDataServlet extends HttpServlet { 19 private static final long serialVersionUID = 1L; 20 21 /** 22 * @see HttpServlet#HttpServlet() 23 */ 24 public sendDataServlet() { 25 super(); 26 // TODO Auto-generated constructor stub 27 } 28 29 /** 30 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 31 */ 32 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 33 response.setContentType("text/html;charset=utf-8"); 34 request.setCharacterEncoding("utf-8"); 35 response.setCharacterEncoding("utf-8"); 36 PrintWriter out = response.getWriter(); 37 String date = request.getParameter("date"); 38 System.out.println(date); 39 String result = DBUtils.queryGlobalLatestDataByDate2(date).toString(); 40 out.write(result); 41 out.flush(); 42 out.close(); 43 } 44 45 /** 46 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 47 */ 48 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 49 // TODO Auto-generated method stub 50 doGet(request, response); 51 } 52 53 }
Android部分的代码
在AndroidManifest.xml中添加两句代码用于联网:
1 <uses-permission android:name="android.permission.INTERNET" /> 2 android:usesCleartextTraffic="true"
activity_main.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" 6 android:id="@+id/activity_main" 7 android:gravity="center_horizontal"> 8 9 <EditText 10 android:id="@+id/query_date" 11 android:layout_width="wrap_content" 12 android:layout_height="wrap_content" 13 android:ems="10" 14 android:inputType="textPersonName" 15 android:text=""/> 16 <Button 17 android:id="@+id/send_request" 18 android:layout_width="wrap_content" 19 android:layout_height="wrap_content" 20 android:text="查询"/> 21 22 <ListView 23 android:layout_width="match_parent" 24 android:layout_height="match_parent"> 25 26 <TextView 27 android:id="@+id/response_data" 28 android:layout_width="match_parent" 29 android:layout_height="wrap_content" 30 /> 31 </ListView> 32 </LinearLayout>
MainActivity.java
1 package com.example.yiqing; 2 3 import androidx.appcompat.app.AppCompatActivity; 4 5 import android.os.Bundle; 6 import android.view.View; 7 import android.widget.Button; 8 import android.widget.EditText; 9 import android.widget.TextView; 10 11 import java.io.BufferedReader; 12 import java.io.IOException; 13 import java.io.InputStream; 14 import java.io.InputStreamReader; 15 import java.net.HttpURLConnection; 16 import java.net.MalformedURLException; 17 import java.net.ProtocolException; 18 import java.net.URL; 19 20 public class MainActivity extends AppCompatActivity { 21 22 private TextView textView; 23 @Override 24 protected void onCreate(Bundle savedInstanceState) { 25 super.onCreate(savedInstanceState); 26 setContentView(R.layout.activity_main); 27 findViewById(R.id.send_request).setOnClickListener(new View.OnClickListener() { 28 @Override 29 public void onClick(View v) { 30 sendData(); 31 } 32 }); 33 34 textView = (TextView) findViewById(R.id.response_data); 35 } 36 37 private void sendData() { 38 //开启线程,发送请求 39 new Thread(new Runnable() { 40 @Override 41 public void run() { 42 HttpURLConnection connection = null; 43 BufferedReader reader = null; 44 try { 45 // EditText editText = findViewById(R.id.query_date); 46 // String date = editText.getText().toString(); 47 URL url = new URL("http://10.0.2.2:8086/yiqing/sendDataServlet?date=2020-03-18"); 48 // URL url = new URL("http://www.163.com"); 49 connection = (HttpURLConnection) url.openConnection(); 50 //设置请求方法 51 connection.setRequestMethod("GET"); 52 //设置连接超时时间(毫秒) 53 connection.setConnectTimeout(5000); 54 //设置读取超时时间(毫秒) 55 connection.setReadTimeout(5000); 56 57 //返回输入流 58 InputStream in = connection.getInputStream(); 59 60 //读取输入流 61 reader = new BufferedReader(new InputStreamReader(in)); 62 StringBuilder result = new StringBuilder(); 63 String line; 64 while ((line = reader.readLine()) != null) { 65 result.append(line); 66 } 67 show(result.toString()); 68 } catch (MalformedURLException e) { 69 e.printStackTrace(); 70 } catch (ProtocolException e) { 71 e.printStackTrace(); 72 } catch (IOException e) { 73 e.printStackTrace(); 74 } finally { 75 if (reader != null) { 76 try { 77 reader.close(); 78 } catch (IOException e) { 79 e.printStackTrace(); 80 } 81 } 82 if (connection != null) {//关闭连接 83 connection.disconnect(); 84 } 85 } 86 } 87 }).start(); 88 89 } 90 91 private void show(final String result) { 92 runOnUiThread(new Runnable() { 93 @Override 94 public void run() { 95 textView.setText(result); 96 } 97 }); 98 } 99 }